2013-04-18 3 views
4

적어도 상황에 따라 Python은 유형을 컴파일 할 때 검사하지 않기 때문에 유형을 확인하지 않습니다. 그러나 누군가가 추가 주석을 기반으로 컴파일 타임 형식 검사를 수행하는 메커니즘을 사용자에게 제공해야합니까? 저자가 여분의 보증을 사용하는 pylint와 같은 것? 내가 좋아하는 뭔가 생각 해요 :Python 컴파일 시간 유형 검사

#guarantee(argument=int, return_type=int) 
def f(x): 
    return x + 3 

#guarantee(argument=int, return_type=str) 
def g(x): 
    return "%d times" % x 

y = f(6) 

# works, z = "9 times" 
z = g(y) 
# error 
a = f(z) 

이 검사는 f(x)int을 허용하도록되어 있지만, 그래서는 str의 z는 g(x)에서 오는 것을 실현, 각 기능에 위의 의견을 해석하는 것입니다. 이 비슷한 것을하는 제품이 있습니까?

+1

내 이해는 PyPy가 다소 비슷하지만 일반적으로 사람들은 Python Python을 사용하지 않으려 고하지 않는다. 대신 엄격한 형식의 언어를 사용한다. 어쨌든 파이썬에는 "컴파일 타임"과 같은 것이 없다. 정적 또는 동적 코드 분석을 수행 할 수 있으며 pyc 로의 변환은 컴파일로 간주 될 수 있지만 근본적인 수준에서 임의 코드는 런타임시 시스템에 대한 모든 것을 변경할 수 있습니다. –

답변

2

PEP 3107은 변수 및 기능에 주석을 도입하는 최근에 완성되었습니다 (최근 작년에 언젠가). 불행히도 (pep 번호에서 알 수 있듯이) 이것은 Python 3.x에만 적용되므로이 기능을 사용하기 위해 작성하는 모든 체커 (또는 코드)는 파이썬 3 일뿐입니다 (실제로 나쁜 것은 아닙니다.).

pylint를 언급 했으므로 실제로 컴파일 타임에 검사를 실행하지 말고 대신 컴파일 후에 검사해야한다고 가정합니다. 이것은 code-quality mailing list에서 논의 할 수있는 훌륭한 도구가 될 것입니다.

+0

이것은 정확히 내가 뭘 찾고 있었는지, 고마워! – noisecapella

+0

@noisecapella 도움을 주셔서 감사합니다. –

0

이것이 파이썬의 기존 런타임 메커니즘에 비해 얼마나 중요한 개선인지는 잘 모르겠습니다. 예를 들어,

def f(x): 
    if not isinstance(x, int): 
     raise TypeError("Expected integer") 
    return x + 3 

def g(x): 
    return "%d times" % x 

# Works. 
y = f(6) 
z = g(y) 
# Fails, raises TypeError. 
a = f(z) 

는 다른 말로하면, 모든 기능과 파이썬의 모든 개체의 모든 방법을 주석없이, 정적 f 또는 g 중 하나의 반환 유형이 정확히 무엇을 결정하기 어렵다. 나는이 줄에있는 정적 검사기가 어떤 가치가 있을지 의심 스럽다.

반환 형식 설명자를 함수에 추가 했어도 실제로 보장됩니까? 코드와 함께 업데이트되지 않을 수있는 문서처럼 보이기 때문에 나중에 잘못된 가정으로 인해 훨씬 ​​더 교활한 오류가 발생합니다.

+2

그리고 ('__str__','__nonzero__' 등을 통해) 다른 것으로 취급되는 객체는 어떻게 될까요? 파이썬은 오리 유형의 기본 레벨에 있습니다. 정적 타이핑을 시도하는 모든 시도가 실패하거나 언어를 어기 게됩니다. –

+0

태그'static-analysis'는 런타임에 부과되는 것이 아니라는 것을 의미합니다. –

+0

나는이 질문에 함축되어 있음을 알고 있지만 가능한 경우 올바른, 관용적 인 대답을 제공하는 것이 더 중요하다고 생각합니다. –

1

누락 된 키워드는 decorator입니다.

당신은 같은 물건을 할 자신 만의 장식을 작성할 수 있습니다

@check(bar=int) 
foo(bar): 
    pass 

당신은 예를 들어 구현 here을 볼 수 있습니다. 이것은 컴파일 타임에 유효하기 때문에 컴파일 체크에는 유효하지 않지만.

+0

예, 그런 일을 한 번 구현했습니다. 이러한 데코레이터를 구현할 때 시원한 문제가 하나 발생하면 IDE에서 수행 한 작업을 IDE에서 인식하게되므로 코드 제안이 엉망이 될 수도 있습니다.편집 : 네아, 그게 문제, 만약 당신이 단지 * args 및 ** kwargs, 코드 제안은 번역에서 길을 잃을거야 : P –