Podczas programowania Python czasami robię a, **
aby dokonać konwersji. Rozumiem, co robi, ale jakie struktury danych modyfikuję? A dict
a co innego? An array
? Czy istnieje nazwa dla **
operatora?
python
operators
type-conversion
Niklas Rosencrantz
źródło
źródło
**
. Moc i „słownik argumentów słów kluczowych”. O czym ty mówisz Dokumentacja zawiera następujące słowa: „Jeśli obecny jest formularz„ ** identyfikator ”, jest on inicjowany w nowym słowniku, otrzymując nadmiar argumentów słów kluczowych, domyślnie w nowym pustym słowniku.” Które z nich wydają się odpowiednie dla twojego pytania?Odpowiedzi:
Nie jest to jako taki operator, więc tak naprawdę nie ma nazwy, ale jest zdefiniowany jako „reguła składniowa” . Więc powinno się to nazywać:
Jeśli masz listę argumentów
*args
, to się nazywa „rozpakowanie argument” , w taki sam sposób**kwargs
nazywany jest „argumentem kluczowe rozpakowaniu” .Jeśli użyjesz go po lewej stronie
=
, jak wa, *middle, end = my_tuple
, powiesz „rozpakowanie krotki” .W sumie istnieją trzy typy argumentów (jednoparametrowych):
*args
Argumentem nazywany jest „zmienny parametr pozycyjny” i**kwargs
jest „zmienny parametr słowo kluczowe”. Argumenty zawierające tylko słowa kluczowe nie mogą być podawane pozycyjnie, ponieważ zmienny parametr pozycyjny przyjmuje wszystkie przekazywane argumenty.Większość z nich można znaleźć w dokumentach PEP 0362 i 3102 , a także w sekcji kontroli przepływu dokumentów. Należy jednak zauważyć, że obiekt podpisu funkcji PEP to tylko szkic, a terminologia może być tylko pomysłem jednej osoby. Ale i tak są to dobre warunki. :)
Zatem argumenty
*
i**
po prostu rozpakowują swoje odpowiednie struktury danych:[1]: Iterables to obiekty, które implementują
__iter__()
metodę, a mapowania to obiekty, które implementująkeys()
i__getitem__()
. Każdy obiekt, który obsługuje protokół ten należy rozumieć przez konstruktorówtuple()
idict()
, dlatego mogą być stosowane do rozpakowywania argumentów.źródło
def f(x, *xs, y=0): pass
nie jest poprawna składnia Pythona 2. {5,6,7}, ani niedef f(x, y=0, *xs):
robi tego, czego można się spodziewać. AFAIK, jedynym sposobem na osiągnięcie (oczywiście) zamierzonego efektu jestdef f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...
. Python 3 obsługuje oryginalną składnię zgodnie z oczekiwaniami.begin, *middle, end = (0, 1, 2, 3, 4, 5)
mowa : składnia również nie działa w Pythonie 2.x.Nie sądzę, żeby to miało nazwę. W Python Docs w sekcji „Rozpakowywanie list argumentów” jest to po prostu nazywane „
**
operatorem”.Nie jestem pewien, co rozumiesz przez „drugą” strukturę danych. Kiedy to zrobisz
f(**kwargs)
, rozpakujesz słownikkwargs
jako sekwencję par klucz-wartość. Nie widzę w tym żadnej innej struktury.Będę skopiować przykład w powyższej dokumentacji dla jasności.
Zobacz także: Co oznaczają * args i ** kwargs?
źródło
f(**kwargs)
...Jeśli nie masz pewności, jak zadzwonić do konkretnego operatora lub jeśli jest on nienazwany, zawsze możesz skorzystać z Waka Waka Bang Splat, aby pomóc Ci dowiedzieć się, jak to nazwać. W tym przypadku
**
nazwałbym todouble-splat
, chociaż istnieją pewne alternatywne nazwy symboli .źródło