Naga gwiazdka w argumentach funkcji?

Co robi Naga gwiazdka w argumentach funkcji?

Kiedy spojrzałem na Moduł ogórkowy , widzę to:

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

Wiem o pojedynczym i podwójnym gwiazdce poprzedzającym argumenty( dla zmiennej liczby argumentów), ale to nic nie poprzedza. I jestem pewien, że to nie ma nic wspólnego z ogórkiem. To pewnie tylko przykład. Nauczyłem się jego nazwy, kiedy wysłałem to do tłumacza:

>>> def func(*):
...     pass
...
  File "<stdin>", line 1
SyntaxError: named arguments must follow bare *

Jeśli ważne, jestem na Pythonie 3.3.0.

Author: Tomerikoo, 2013-01-13

6 answers

Bare * jest używany do zmuszania wywołującego do użycia nazwanych argumentów - więc nie można zdefiniować funkcji z * jako argumentem, gdy nie ma następujących argumentów kluczowych.

Zobacz ta ODPOWIEDŹlub dokumentacja Pythona 3 Po Więcej Szczegółów.

 253
Author: Kimvais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:05

Podczas gdy oryginalna odpowiedź całkowicie odpowiada na pytanie, wystarczy dodać trochę powiązanych informacji. Zachowanie pojedynczej gwiazdki wynika z PEP-3102. Cytując pokrewny dział:

The second syntactical change is to allow the argument name to
be omitted for a varargs argument. The meaning of this is to
allow for keyword-only arguments for functions that would not
otherwise take a varargs argument:

    def compare(a, b, *, key=None):
        ...

W prostym języku angielskim oznacza to, że aby przekazać wartość klucza, musisz jawnie przekazać ją jako key="value".

 76
Author: mu 無,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 04:25:43
def func(*, a, b):
    print(a)
    print(b)

func("gg") # TypeError: func() takes 0 positional arguments but 1 was given
func(a="gg") # TypeError: func() missing 1 required keyword-only argument: 'b'
func(a="aa", b="bb", c="cc") # TypeError: func() got an unexpected keyword argument 'c'
func(a="aa", b="bb", "cc") # SyntaxError: positional argument follows keyword argument
func(a="aa", b="bb") # aa, bb

Powyższy przykład z * * kwargs

def func(*, a, b, **kwargs):
    print(a)
    print(b)
    print(kwargs)

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}
 30
Author: laycat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-22 19:25:27

Semantycznie oznacza, że następujące po nim argumenty są tylko słowami kluczowymi, więc otrzymasz błąd, jeśli spróbujesz podać argument bez podania jego nazwy. Na przykład:

>>> def f(a, *, b):
...     return a + b
...
>>> f(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 1 positional argument but 2 were given
>>> f(1, b=2)
3

Pragmatycznie oznacza to, że musisz wywołać funkcję za pomocą argumentu ze słowem kluczowym. Zwykle robi się to wtedy, gdy trudno byłoby zrozumieć cel argumentu bez podpowiedzi podanej przez nazwę argumentu.

Porównaj np. sorted(nums, reverse=True) vs. jeśli napisałeś sorted(nums, True). Ten ostatni byłby znacznie mniej czytelny, więc Programiści Pythona zdecydowali się na napisanie go w poprzedni sposób.

 10
Author: kaya3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-25 04:12:31

Załóżmy, że masz funkcję:

def sum(a,key=5):
    return a + key 

Możesz wywołać tę funkcję na dwa sposoby:

sum(1,2) lub sum(1,key=2)

Załóżmy, że chcesz, aby Funkcja sum była wywoływana tylko za pomocą argumentów słów kluczowych.

Dodajesz * do listy parametrów funkcji, aby zaznaczyć koniec argumentów pozycyjnych.

Więc funkcja zdefiniowana jako:

def sum(a,*,key=5):
    return a + key 

Można wywoływać tylko za pomocą sum(1,key=2)

 9
Author: rok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-01 13:14:20

Znalazłem następujący link, który jest bardzo pomocny w wyjaśnieniu *, *args i **kwargs:

Https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

Zasadniczo, oprócz powyższych odpowiedzi, nauczyłem się z powyższej strony (kredyt: https://pythontips.com/author/yasoob008/):

Z funkcją demonstracyjną zdefiniowaną najpierw poniżej, są dwa przykłady, jeden z *args i jeden z **kwargs

def test_args_kwargs(arg1, arg2, arg3):
    print "arg1:", arg1
    print "arg2:", arg2
    print "arg3:", arg3

# first with *args
>>> args = ("two", 3,5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

# now with **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two","arg1":5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3

Więc *args pozwala dynamicznie budować listę argumentów, które będą pobierane w kolejności, w jakiej są podawane, podczas gdy {[4] } może umożliwić przekazywanie nazwanych argumentów i może być przetwarzane według nazwy (niezależnie od kolejności, w jakiej są podawane).

Strona kontynuuje, zauważając, że prawidłowa kolejność argumentów powinna być:

some_func(fargs,*args,**kwargs)
 -1
Author: lb_so,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-05 15:46:44