Python 3.2.3. Było kilka pomysłów wymienione poniżej , które działają na regularne var, ale wydaje się, ** kwargs grać według różnych zasad ... więc dlaczego nie ta praca i jak mogę sprawdzić, czy klucz w ** kwargs istnieje?
if kwargs['errormessage']:
print("It exists")
Myślę też, że to powinno działać, ale tak nie jest -
if errormessage in kwargs:
print("yeah it's here")
Zgaduję, ponieważ kwargs jest iterowalny? Czy muszę go powtarzać, aby sprawdzić, czy jest tam określony klucz?
python
dictionary
python-3.x
kwargs
Zamphatta
źródło
źródło
Odpowiedzi:
Chcesz
Aby uzyskać wartość
errormessage
W ten sposób
kwargs
jest po prostu kolejnymdict
. Twój pierwszy przykładif kwargs['errormessage']
oznacza „pobierz wartość skojarzoną z kluczem„ errormessage ”w kwargs, a następnie sprawdź jego wartość bool”. Więc jeśli nie ma takiego klucza, otrzymasz plikKeyError
.Twój drugi przykład
if errormessage in kwargs:
oznacza „jeślikwargs
zawiera element o nazwie„errormessage
”i jeśli„errormessage
”nie jest nazwą zmiennej, otrzymasz plikNameError
.Powinienem wspomnieć, że słowniki mają również metodę,
.get()
która akceptuje domyślny parametr (sam domyślnyNone
), więckwargs.get("errormessage")
zwraca wartość, jeśli ten klucz istnieje i wNone
przeciwnym razie (podobniekwargs.get("errormessage", 17)
robi to, co myślisz, że robi). Jeśli nie zależy ci na różnicy między kluczem istniejącym a posiadaniemNone
jako wartości lub kluczem nieistniejącym, może to być przydatne.źródło
kwargs.get("errormessage", 17)
może zwrócić swoją wartość lub17
jeśli komunikat o błędzie nie istnieje - ale nie jestem pewien. Czy to jest poprawne?Odpowiedzi DSM i Tadeck odpowiadają bezpośrednio na twoje pytanie.
W moich skryptach często korzystam z wygodnych
dict.pop()
argumentów opcjonalnych i dodatkowych. Oto przykład prostegoprint()
opakowania:Następnie:
Jak widać, jeśli
prefix
nie występuje wkwargs
, to domyślny''
(pusty ciąg) jest przechowywany wprefix
zmiennej lokalnej . Jeśli jest podana, używana jest jej wartość.Generalnie jest to zwarty i czytelny przepis na pisanie opakowań dla dowolnego rodzaju funkcji: zawsze przekazuj argumenty, których nie rozumiesz i nawet nie wiesz, czy one istnieją. Jeśli zawsze przechodzisz
*args
i**kwargs
robisz swój kod wolniej i wymaga trochę więcej pisania, ale jeśli interfejsy wywoływanej funkcji (w tym przypadkuprint
) ulegną zmianie, nie musisz zmieniać swojego kodu. Takie podejście skraca czas programowania, jednocześnie obsługując wszystkie zmiany interfejsu.źródło
prefix
.Po prostu to:
Musisz sprawdzić, czy klucz jest w słowniku. Składnia tego jest następująca
some_key in some_dict
(gdziesome_key
jest coś haszującego, niekoniecznie ciąg znaków).Pomysły, które połączyłeś ( te pomysły ), zawierały przykłady sprawdzania, czy określony klucz istnieje w słownikach zwróconych przez
locals()
iglobals()
. Twój przykład jest podobny, ponieważ sprawdzasz istnienie określonego klucza wkwargs
słowniku (słownik zawierający argumenty słów kluczowych).źródło
Jednym ze sposobów jest dodanie go samodzielnie! W jaki sposób? Łącząc się
kwargs
z kilkoma domyślnymi plikami. Nie będzie to właściwe za każdym razem, na przykład, jeśli klucze nie są ci z góry znane. Jeśli jednak tak jest, oto prosty przykład:Wartości domyślne są ustawione w słowniku
args
, który obejmuje wszystkie oczekiwane klucze. Najpierw sprawdzamy, czy w kwargach są jakieś nieoczekiwane klucze. Następnie aktualizujemy, zaargs
pomocąkwargs
których nadpisze się wszelkie nowe wartości ustawione przez użytkownika. Nie musimy sprawdzać, czy klucz istnieje, teraz używamy goargs
jako naszego słownika argumentów i nie potrzebujemy go dalejkwargs
.źródło
Możesz łatwo odkryć te rzeczy samodzielnie:
źródło
in
operatora samego w sobie nie jest łatwe, jeśli nigdy nie programowałeś i / lub nie znasz Pythona. To jest tylko zasugerował wdict.get()
idict.setdefault()
pomoc.źródło