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


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.