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


242

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

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

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에 있습니다.


답변:


221

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

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


3
을 포함하여 모든 위치 (이름이없는) 인수 *args는 bare 앞에 와야합니다 *.
BallpointBen

4
또한 위치 전용 인수의 끝을 표시하는 일종의 대응하는 /가 있습니다 ( stackoverflow.com/questions/28243832/… ).
Stephen

2
@BallpointBen : *은 대신에 *args있으며 그 반대도 마찬가지입니다. 그들은 서명으로 공존 할 수 없습니다. 그것이 그들이 선택한 이유입니다 *. 이전에는 *args순전히 위치 인수를 강제하는 유일한 방법이었으며, 위치 적 으로 전달 될 수 있는 인수의 끝을 표시했습니다 (남은 모든 위치 인수를 수집 했으므로 다음 명명 된 인수에 도달 할 수 있음). *같은 "위치 논쟁은 여기를 넘어 설 수 없다"는 것을 의미하지만, 이름이 없다는 것은 "하지만 나는 그것을 넣을 장소를 제공하지 않기 때문에 전혀 받아들이지 않을 것"을 의미한다.
ShadowRanger

70

원래 답변이 질문에 완전히 대답하는 동안 약간의 관련 정보를 추가하면됩니다. 단일 별표의 동작은에서 파생됩니다 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".


아, 그게 훨씬 명확 해집니다. 따라서 실제로 인수 *를 갖는 것은 인수 args *를 갖는 것과 같습니다. 그러나 이름을 지정하지 않았으므로 나머지 인수가 키워드가되도록 강제로 나머지 모든 위치 인수를 조용히하게됩니다. -뿐.
Stephen

11
@Stephen 나도 원래 생각 *했지만 베어의 효과는 남아있는 위치 인수를 혼란 스럽게하는 것이지만 사실은 아닙니다. 함수가 예상하는 것보다 추가 위치 인수를 전달하면 다음과 같은 오류가 발생합니다.foo() takes exactly 1 positional argument (2 given)
Ajay M

19
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'}

6

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

>>> 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). 후자는 읽기 어렵 기 때문에 파이썬 개발자는 이전 방식으로 작성하도록 선택했습니다.


4

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

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)


-1

나는 매우 설명 도움이 될 수는 아래의 링크를 발견했습니다 *, *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)

2
이 답변은 질문과 거의 관련이 없습니다. 심지어 기능이없는 오래된 파이썬 버전을 사용하고 있습니다.
Antti Haapala
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.