[python] 함수 인수에 별표가 있습니까?

함수의 인수에서 별표는 무엇을합니까?

내가 보았을 때 피클 모듈 ,이 참조 :

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

나는 인수 앞의 단일 및 이중 별표에 대해 알고 있지만 (다수의 인수에 대해) 이것은 선행하지 않습니다. 피클과는 아무런 관련이 없습니다. 그것은 아마도 이런 일의 예일뿐입니다. 나는 이것을 통역사에게 보낼 때만 그 이름을 배웠다.

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

중요하다면 파이썬 3.3.0에 있습니다.



답변

베어 (Bare) *는 호출자가 명명 된 인수를 사용하도록 강제하는 데 사용되므로 *다음 키워드 인수가없는 경우 함수를 인수로 정의 할 수 없습니다 .

자세한 내용은 이 답변 또는 Python 3 설명서 를 참조하십시오.


답변

원래 답변이 질문에 완전히 대답하는 동안 약간의 관련 정보를 추가하면됩니다. 단일 별표의 동작은에서 파생됩니다 PEP-3102. 관련 섹션 인용 :

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):
        ...

간단한 영어로, key의 값을 전달하려면 명시 적으로로 전달해야합니다 key="value".


답변

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

** kwargs를 사용한 위의 예

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

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}


답변

의미 상, 그것은 뒤에 오는 인수가 키워드 전용임을 의미하므로 이름을 지정하지 않고 인수를 제공하려고하면 오류가 발생합니다. 예를 들면 다음과 같습니다.

>>> 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

실제로 키워드 인수를 사용하여 함수를 호출해야합니다. 일반적으로 인수 이름으로 암시하지 않고 인수의 목적을 이해하기 어려울 때 수행됩니다.

sorted(nums, reverse=True)당신이 쓴다면 예를 비교하십시오 sorted(nums, True). 후자는 읽기 어렵 기 때문에 파이썬 개발자는 이전 방식으로 작성하도록 선택했습니다.


답변

기능이 있다고 가정하십시오.

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

이 함수는 두 가지 방법으로 호출 할 수 있습니다.

sum(1,2) 또는 sum(1,key=2)

기능을 원한다고 가정 sum키워드 인수 만 사용하여 를 호출 .

*함수 매개 변수 목록에 추가 하여 위치 인수의 끝을 표시합니다.

따라서 함수는 다음과 같이 정의됩니다.

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

다음을 사용해서 만 호출 할 수 있습니다. sum(1,key=2)


답변

나는 매우 설명 도움이 될 수는 아래의 링크를 발견했습니다 *, *args그리고 **kwargs:

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

본질적으로 위의 답변 외에도 위 사이트 (신용 : https://pythontips.com/author/yasoob008/ )에서 다음을 배웠습니다 .

아래에 첫 번째로 정의 된 데모 기능에는 두 가지 예가 *args있습니다.**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

따라서 *args인수 순서에 따라 인수 목록을 동적으로 작성할 수 있습니다.**kwargs 수 있지만, NAMED 인수를 전달할 수 있으며 이에 따라 NAME에서 처리 할 수 ​​있습니다 (공급 순서에 관계없이) .

사이트는 계속해서 올바른 인수 순서가 다음과 같아야합니다.

some_func(fargs,*args,**kwargs)


답변