2014-09-26 2 views
1

함수가 필요한 수의 인수를 가지고 있는지 확인하기 위해 (바람직하게는 ast 모듈을 사용하는) 방법이 있습니까?파이썬 함수에 필요한 인수 얻기

예를 들어 사용자 인터페이스에서 사용자가 "sum (x)"와 같은 python 표현식을 삽입 할 수 있지만 사용자가 실수로 "sum()"을 입력하면 런타임 전에 해당 표현식의 유효성을 검사 할 수 있습니까?

심볼 트리의 모든 노드에서 ast.dump를 호출했지만 이러한 심볼에 대한 정보가 이러한 종류의 분석에는 충분하지 않은 것 같습니다. 예를 들어

:

#own debug code added to ast.py 
def visit(self, node): 
    print(dump(node),True, False) 
    method = 'visit_' + node.__class__.__name__ 
    visitor = getattr(self, method, self.generic_visit) 
    return visitor(node) 

수율 :

'Module(body=[Expr(value=Call(func=Attribute(value=Name(id='Math', ctx=Load()), 
attr='cos', ctx=Load()), args=[Num(n=0.5)], 
keywords=[], starargs=None, kwargs=None))])' 

정말 특정 수의 인수를 필요로하지 않는 인쇄와 같은 기능()에서 차이가 없습니다.

+2

호출되는 개체를 분석하고 분석해야합니다 *. *. 파이썬은 실제로 * 호출을 실행할 때까지 이것을 알지 못한다. –

+0

파이썬 함수에 "필수 인수"를 어떻게 정의합니까? 이 정의는 어디에 정의되어 있습니까? –

+2

나는 모듈'ast.py'의 이름을 지정하지 않겠다. – roippi

답변

0

호출 식에서 볼 수없는 어떤 인수 을 호출 할 수있는입니다. 파이썬은 이것을 실행시 호출 가능하도록 완전히 남겨 둡니다.

정적 코드 분석의 경우 유일한 옵션은 호출 가능 코드를 해결하는 것입니다 (예 : 런타임시 변경 될 수 있기를 기대합니다). C 정의 된 개체의 경우 자체 서명 데이터베이스가 있습니다. Komodo CodeIntel 라이브러리에있는 경로입니다 (OSS, SublimeCodeIntel과 같은 다른 프로젝트에서 사용됨). C 기반 확장은 기본적으로 호출 가능 서명을 포함하는 CIX files으로 지원됩니다.

런타임시 inspect.signature()을 사용하여 호출 서명을 인트로 스팅 할 수 있습니다. C 함수는 현재 부분적으로 만 지원되며, Argument Clinic을 사용하는 사람들 만 서명 정보를 저장할 수 있습니다. What are __signature__ and __text_signature__ used for in Python 3.4