파이썬 함수의 인수 개수를 어떻게 찾을 수 있습니까?


163

파이썬 함수의 인수 개수를 어떻게 찾을 수 있습니까? 나는 얼마나 많은 일반 인수가 있고 얼마나 많은 명명 된 인수가 있는지 알아야합니다.

예:

def someMethod(self, arg1, kwarg1=None):
    pass

이 메소드에는 2 개의 인수와 1 개의 명명 된 인수가 있습니다.


43
질문은 전적으로 보증됩니다. 그렇지 않다면 (항상 소스를 읽을 수 있기 때문에) inspect표준 라이브러리 모듈에 대한 정당성이 없습니다 .
흐름

다수의 언어가 하나 이상의 정당화되지 않은 기능을 구현합니다. 이 inspect모듈에는 다른 많은 기능이 있으므로 특정 기능이 하나라도 있다면 전체 모듈이 정당하지 않다고 말할 수는 없습니다. 또한이 기능이 어떻게 잘못 사용되는지 쉽게 알 수 있습니다. ( stackoverflow.com/questions/741950 참조 ). 즉, 특히 데코레이터 및 함수에서 작동하는 다른 함수를 작성하는 데 유용한 기능입니다.
user1612868

답변:


131

이전에 허용 대답이되어 사용되지 않는 현재의 Python 3.0. 사용하는 대신 inspect.getargspec이제 Signature이를 대체 한 클래스를 선택해야 합니다.

함수를 통해 쉽게 서명을 작성할 수 signature있습니다 .

from inspect import signature

def someMethod(self, arg1, kwarg1=None):
    pass

sig = signature(someMethod)

이제 매개 변수를 사용하여 해당 매개 변수를 빠르게 볼 수 있습니다 str.

str(sig)  # returns: '(self, arg1, kwarg1=None)'

또는을 통해 속성 이름을 매개 변수 객체에 매핑 할 수도 있습니다 sig.parameters.

params = sig.parameters 
print(params['kwarg1']) # prints: kwarg1=20

또한 호출 할 수 있습니다 lensig.parameters이 기능이 필요 인수의 수를 볼 수 :

print(len(params))  # 3

params매핑의 각 항목 은 실제로 인생을 편하게 해주는 추가 속성을 가진 Parameter객체 입니다. 예를 들어, 매개 변수를 잡고 기본값을 보는 것은 이제 다음을 통해 쉽게 수행 할 수 있습니다.

kwarg1 = params['kwarg1']
kwarg1.default # returns: None

에 포함 된 나머지 개체에 대해서도 유사합니다 parameters.


Python 2.x사용자의 경우 더 이상 사용되지 inspect.getargspec 않지만 언어는 곧 :-)입니다. Signature클래스는 사용할 수 없습니다 2.x시리즈되지 않습니다. 따라서 여전히 작업해야합니다 inspect.getargspec.

당신이 코드가있는 경우 파이썬 2와 3 사이의 전환에 관해서는,의 인터페이스에 의존하는 getargspec파이썬 2와 전환 signature에하는 것은 3너무 어렵습니다, 당신은 가치있는 옵션이 있습니까 사용을 inspect.getfullargspec. getargspec함수의 인수를 가져 와서 다음과 같은 일부 추가 사례를 처리하기 위해 (호출 가능한 단일 인수) 와 유사한 인터페이스를 제공합니다 getargspec.

from inspect import getfullargspec

def someMethod(self, arg1, kwarg1=None):
    pass

args = getfullargspec(someMethod)

와 마찬가지로 getargspec, getfullargspec반환 NamedTuple인수를 포함하는.

print(args)
FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})

1
@ GeorgSchölly를 환영합니다. 나는되지 또는 오른쪽으로 몰래 내려 한 중이 하나 제공하는 솔루션 같은 인기있는 질문 놀랐다합니다 (에서 엿 co_argcount속성입니다.)
디미트리 Fasarakis 힐리에게

1
getfullargspec는 Python 2.x에서 구현되지 않으므로 다음을 사용해야합니다.getargspec
Peter Gibson

getargspec내장 함수에서는 작동하지 않습니다 : getargspec(open)제공 합니다 일부 아이디어 는 이 답변TypeError: <built-in function open> is not a Python function참조하십시오 ...
starfry

마지막 예에서, 당신이 print(args)할 때 얻을 defaults=(None,)수 없습니다 defaults=None.
Seanny123

장식 후에 장식 된 함수의 원래 매개 변수 수를 얻는 방법이 있습니까?
Gulats

117
import inspect
inspect.getargspec(someMethod)

검사 모듈 참조


5
일반적으로 원하는 것이지만 내장 함수에서는 작동하지 않습니다. 내장에 대한이 정보를 얻는 유일한 방법은 문서 문자열 을 파싱 하는 것입니다.
Cerin

5
이것은 파이썬 3에서 더 이상 사용되지 않습니다 : docs.python.org/3/library/inspect.html#inspect.getargspec
noisecapella

Python 3에서 더 이상 사용되지 않는 솔루션이 있습니까?
hlin117

1
링크를 따라하는 경우는 사용을 권장 것을 당신은 볼 것이다 inspect.signature- docs.python.org/3/library/inspect.html#inspect.signature
coderforlife

: 여기 문서화 문자열을 구문 분석하지 않고 내장 기능에 대한 다른 가능한 방법을 게시 stackoverflow.com/questions/48567935/...
하여 HelloWorld

31
someMethod.func_code.co_argcount

또는 현재 기능 이름이 결정되지 않은 경우 :

import sys

sys._getframe().func_code.co_argcount

4
@elyase, 그냥하십시오 : dir(someMethod)-> 'func_code'; 더 나아가십시오 : dir(someMethod.func_code)-> 'co_argcount'; 내장 기능을 사용하여 dir()객체의 사용 가능한 방법을 결정할 수 있습니다.


Python 3을 지원하려면 :six.get_function_code(someMethod).co_argcount
noisecapella

8
@noisecapella는 간단하게 할 수있을 때 타사 모듈이 필요하지 않습니다some_method.__code__.co_argcount
vallentin

1
일반적으로 함수 객체 내부를 들여다 보지 말아야 합니다. co_argcount코드 객체를 평가하는 동안 내부적으로 사용됩니다. 내가 말하려는 것은 실제로 이러한 속성이 한 릴리스에서 다른 릴리스로 변경되지 않는다는 보장은 없습니다.
Dimitris Fasarakis Hilliard

16

inspect.getargspec ()

함수 인수의 이름과 기본값을 가져옵니다. 네 가지의 튜플이 반환됩니다 : (args, varargs, varkw, defaults). args는 인수 이름의 목록입니다 (중첩 목록을 포함 할 수 있음). varargs 및 varkw는 * 및 ** 인수의 이름이거나 None입니다. 기본값은 기본 인수 값의 튜플이거나 기본 인수가 없으면 None입니다. 이 튜플에 n 개의 요소가 있으면 args에 나열된 마지막 n 개의 요소에 해당합니다.

버전 2.6으로 변경 : 명명 된 튜플 ArgSpec (args, varargs, 키워드, 기본값)을 반환합니다.

참조 캔 - 당신 - 목록 - 더 - 키워드 인수-A-파이썬 기능은-받습니다 .


5

위의 내용에 덧붙여 대부분의 경우 help () 함수가 실제로 도움이된다는 것을 알았습니다.

예를 들어, 인수에 대한 모든 세부 사항을 제공합니다.

help(<method>)

아래에 제공

method(self, **kwargs) method of apiclient.discovery.Resource instance
Retrieves a report which is a collection of properties / statistics for a specific customer.

Args:
  date: string, Represents the date in yyyy-mm-dd format for which the data is to be fetched. (required)
  pageToken: string, Token to specify next page.
  parameters: string, Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.

Returns:
  An object of the form:

    { # JSON template for a collection of usage reports.
    "nextPageToken": "A String", # Token for retrieving the next page
    "kind": "admin#reports#usageReports", # Th

빼기 버튼을 클릭하는 것보다 게시물에 문제가있는 것에 대해 의견을 남기는 것이 좋습니다.
Venu Murthy

2
help함수는 docstring이 말하는 것만 보여줍니다. 질문의 함수 정의와 작동하는지 테스트 했습니까?
0xc0de

@ 0xc0de-테스트 했습니까? 실제로 작동하기 때문입니다. help()문서화되지 않은 코드에서도 여전히 argspec을 인쇄하고 코드가 정의 된 위치를 알려줍니다. 원래 질문을 게시 한 사람은 기계적인 답변이든 인간 친화적 인 답변이 필요한지 확실하지 않았습니다. 인간 친화적이어야한다면 help()완벽하게 적합합니다.
ArtOfWarfare

@ArtOfWarfare 모두에서 같은 지금 당신은 어떤 구문 분석해야하지 help()반환하고, 시도하고를 발견 args하고 kwargs.
vallentin

5

Python 2와 Python 3.6 이상에서 이식 가능한 방식 으로이 작업을 수행하려는 사람들에게 희소식 : 사용 inspect.getfullargspec()방법. Python 2.x 및 3.6 이상에서 작동합니다.

Jim Fasarakis Hilliard와 다른 사람들이 지적했듯이 다음과 같이 사용되었습니다.
1. Python 2.x : use inspect.getargspec()
2. Python 3.x : 서명을 사용 getargspec()하고 getfullargspec()사용되지 않습니다.

그러나 파이썬 3.6 (일반적인 수요에 따라)을 시작하면 상황이 더 좋아졌습니다.

Python 3 문서 페이지에서 :

inspect.getfullargspec (func)

버전 3.6으로 변경 :이 메소드는 이전 signature()에 Python 3.5 에서 선호되지 않는 것으로 문서화 되었지만 레거시 getargspec()API 에서 마이그레이션하는 단일 소스 Python 2/3 코드에 대해 명확하게 지원되는 표준 인터페이스를 복원하기 위해이 결정이 취소되었습니다 .



2

다른 답변에서 알 수 있듯이 getargspec쿼리되는 것이 실제로 함수 인 한 잘 작동합니다. 그것은 작동하지 않습니다 내장 과 같은 기능 open, len등, 이러한 경우에 예외가 발생합니다 :

TypeError: <built-in function open> is not a Python function

아래 함수 ( 이 답변에서 영감을 얻음 )는 해결 방법을 보여줍니다. 다음과 같이 예상되는 인수 수를 반환합니다 f.

from inspect import isfunction, getargspec
def num_args(f):
  if isfunction(f):
    return len(getargspec(f).args)
  else:
    spec = f.__doc__.split('\n')[0]
    args = spec[spec.find('(')+1:spec.find(')')]
    return args.count(',')+1 if args else 0

아이디어는 __doc__문자열 에서 함수 스펙을 구문 분석하는 것입니다 . 분명히 이것은 문자열의 형식에 의존하므로 거의 견고하지 않습니다!


2

func.__code__.co_argcount당신에게주는 있는 인수를 하기 전에 *args

func.__kwdefaults__당신에게의 DICT 제공 키워드 인자 AFTER를 *args

func.__code__.co_kwonlyargcount 동일하다 len(func.__kwdefaults__)

func.__defaults__이전에 나타나는 선택적 인수 의 값을 제공합니다 *args

간단한 설명은 다음과 같습니다.

삽화

>>> def a(b, c, d, e, f=1, g=3, h=None, *i, j=2, k=3, **L):
    pass

>>> a.__code__.co_argcount
7
>>> a.__defaults__
(1, 3, None)
>>> len(a.__defaults__)
3
>>> 
>>> 
>>> a.__kwdefaults__
{'j': 2, 'k': 3}
>>> len(a.__kwdefaults__)
2
>>> a.__code__.co_kwonlyargcount
2

0

에:

import inspect 

class X:
    def xyz(self, a, b, c): 
        return 

print(len(inspect.getfullargspec(X.xyz).args))

밖:

4


참고 : xyz가 클래스 X에없고 "self"가없고 "a, b, c"만있는 경우 3을 인쇄했을 것입니다.

3.5 아래 파이썬의 경우, 교체 할 수 있습니다 inspect.getfullargspec에 의해 inspect.getargspec위의 코드이다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.