2012-01-18 3 views
1

글쎄, 저는 파이썬을 좋아하지만, 두 가지 성가신 내용을 주로 찾습니다. 선언 아래에는 자체 및 문서 문자열이 있습니다.파이썬 코드에서 문서 문자열의 위치를 ​​변경하십시오.

내가 알고 싶습니다. 내 코드에서 선언 전에 내 문서 문자열을 어떻게 가져야합니까? 예 :

"""Class docstring""" 
class MyClass(object): 
    "Method documentation" 
    def my_method(self): 
     pass 

아마도 어떤 형태의 데코레이터를 사용하고 있을까요?

+2

확실 :'#';-) 사용 – Tim

+0

문서를 올바르게 추출 할 수있는 도구가있는 경우 유효한 대답입니다. :) –

+7

당신은 파이썬의 곡식으로 작업하고 디자인과 싸우지 않기 위해 스스로 부탁 할 것입니다. 그냥 선생님 ;-) –

답변

3

__doc__ 속성을 설정하는 장식을 작성할 수 있습니다 :

def doc(docstr): 
    def deco(f): 
     f.__doc__ = docstr 
     return f 
    return deco 

이 새로운 스타일의 클래스에 대한 기능과 이전 스타일 클래스 작동하지만하지 않습니다는 __doc__ 속성 이후 새로운 스타일의 클래스는 읽기 전용입니다 (메타 클래스를 사용하지 않으면 거의 이득을 얻지 못해 더욱 복잡해집니다).

어쨌든 이러한 장식자를 사용하지 말 것을 권장합니다. 그냥 평범한 대회에 충실하십시오. 그런 식으로, 동료 개발자가 즉시 문서화 문자열의 소스 코드를 분석하는 도구가 제대로 작동하는 문서화 문자열 무엇 이해 등

편집 :

def doc(docstr): 
    def deco(f): 
     if isinstance(f, type): 
      d = vars(f).copy() 
      d["__doc__"] = docstr 
      return type(f.__name__, f.__bases__, d) 
     f.__doc__ = docstr 
     return f 
    return deco 
:
새로운 스타일의 클래스를 포함하려면,이 구현을 사용할 수 있습니다

__doc__은 읽기 전용이므로 원하는 문서로 새 유형 객체를 만들어야합니다. 단순화를 위해 사용자 정의 메타 클래스는 고려하지 않습니다 (원하는 경우 type을 위의 코드에서 f.__class__로 바꿉니다).

이번에도이 데코레이터를 사용하지 않는 것이 좋습니다. 당신은 이미 귀하의 질문에 제안으로 다음과 같이

+1

아주 좋습니다. 나는 쉬운 해결책이 가능하다면 궁금했지만, 모든 사람들이 말했듯이 그것은 의사 소통을 손상시킬 것이다. :) 나는 의사 소통의 관습을 준수하려고 노력할 것이다. 감사. –

+0

python 2.7.2에서 새로운 스타일의 클래스'__doc__'를 할당하는 데 문제가 없습니다. – Marcin

+0

@SvenMarnach : 분명히 Django 클래스는 새로운 스타일의 클래스에도 '__doc__'을 가질 수 있습니다. 나는 이것이 규칙의 예외라는 것을 깨닫지 못했다. – Marcin

1

그래도 작동하지 않습니다. docstring은 정의에 따라 선언 다음의 행에있는 문자열입니다.

데코레이터로이 작업을 실제로 수행하려는 경우에는 래핑 된 함수 (또는 클래스)의 __doc__ 속성을 설정하는 데코레이터를 만들 수 있습니다.

+1

+1이 접근 방식은 잘 작동합니다. –

-1

정말로 알고 싶다면.

def doc(text): 
    def w(f): 
    f.__doc__ = text 
    return f 
    return w 
+0

멋지고 간단하지만 스벤이 말했듯이 새로운 스타일 수업에는 효과가 없습니다. –

+0

@ 티아고 :하지만 여전히 기능에 관계없이 작동합니다. –

+0

@Ignacio : 예, 기능에 대해 작동합니다. 마지막 행 다음에 "return w"를 완성하십시오. 그것 없이는 예외가 시작됩니다. 편집 : 좋아, 나는 지금 교정을 보았다. 참고로, 나는 그것을 downvote하지 않았다. –

2

, 당신은 뭔가를 할 수 :

from functools import wraps 

def docstring(docstr): 
    def decorator(cls): 
     @wraps(cls) 
     def wrapper(*args, **kwargs): 
      return cls(*args, **kwargs) 
     wrapper.__doc__ = docstr 
     return wrapper 
    return decorator 

@docstring("""Class docstring""") 
class MyClass(object): 
    def my_method(self): 
     pass 

print MyClass.__doc__ # Class docstring 

는 그러나, 나는 현재 구문에 비해이 특히 더 잘 찾을 수 없습니다.

+2

이것은'MyClass'를 함수로 바꾸는 것을 방해합니다. 표현은''와 같을 것이고'__base__' 같은 특별한 속성에 접근 할 수 없게됩니다. –

+0

어떤 타입 식별 함수에도 영향을 미칠 수 있습니까? –

+0

@ThiagoChaves : isinstance()를 의미합니까? 이것은 더 이상 작동하지 않을 것이며, 그러한 장식자를 가진 수업에서 파생되는 것도 가능하지 않을 것입니다. 결국이 데코레이터는 완전히 사용할 수 없게 될 것입니다. –

관련 문제