2016-09-17 2 views
3

싱글 톤으로 변경하는 함수와 클래스 데코레이터가 있지만 docstring은 종류가 떨어졌습니다. 변환 함수는 덮어 써야하는 자체 docstring이있는 클래스 객체를 반환합니다. 이 문제를 어떻게 해결할 수 있습니까? Bit을 검사프로그래밍 방식으로 클래스 객체의 문서 문자열을 변경하십시오.

def singleton(cls): 
    return cls() 

def singletonfunction(func): 
    return func() 

@singletonfunction 
def Bit(): 
    """A 1-bit BitField; must be enclosed in a BitStruct""" 
    return BitsInteger(1) 

BitInteger 문서화 문자열이 아닌 함수의 하나를 얻을 수 있습니다.

답변

1

는 원래 버전이 같은 가정하자 :

b.__doc_ : BitsInteger docstring 

이것은 당신이 무엇을 기대하지 않을 수 있습니다 :

class BitsInteger: 
    """BitsInteger docstring""" 
    def __init__(self, num): 
     pass 

def singleton(cls): 
    return cls() 

def singletonfunction(func): 
    return func() 

@singletonfunction 
def Bit(): 
    """A 1-bit BitField; must be enclosed in a BitStruct""" 
    return BitsInteger(1) 

b = Bit 
print("b.__doc__ :", b.__doc__) 

이 Python3.5와이 실행 출력을 제공합니다. 실제로 유형의 당신이 b을 볼 수 있듯이 정말로 무슨 일하는 것입니다 때문에 BitsInteger

이유는

>>> vars() 
{'__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, 'b': <__main__.BitsInteger object at 0x7ff05d2ae3c8>, '__spec__': None, 'singletonfunction': <function singletonfunction at 0x7ff05d2b40d0>, 'singleton': <function singleton at 0x7ff05d30cd08>, '__cached__': None, 'BitsInteger': <class '__main__.BitsInteger'>, '__loader__': <_frozen_importlib.SourceFileLoader object at 0x7ff05d2eb4a8>, '__package__': None, 'Bit': <__main__.BitsInteger object at 0x7ff05d2ae3c8>, '__doc__': None} 
>>> 

: 우리가 python -i original.py 실행할 때 우리는 주변에 정말 여기에서 무슨 일이 일어나고 있는지를 살펴 수 있습니다 당신은 쓸 때 :

def Bit(): 
    """Bit docstring""" 
    ... 
    return BitsInteger(1) 
Bit = singleton_function(Bit) 
01 :

@singleton_function 
def Bit(): 
    """Bit docstring""" 
    ... 
    return BitsInteger(1) 

당신은 정말 그냥 이것에 대한 문법 설탕을 받고

이 경우 Bitsingleton_function의 반환 값이며 실제로는 BitsInteger입니다. 나는 당신이 통사론 설탕을 벗길 때 여기에서 일어나는 일이 훨씬 더 명확하다는 것을 발견합니다. 당신이 볼 때 지금

b.__doc_ : A 1-bit BitField; must be enclosed in a BitStruct 

: 당신은 문서화 문자열을 변경하지 않는 장식의 편의를하고 싶은 경우

나는 wrapt

import wrapt 

class BitsInteger: 
    """BitsInteger docstring""" 
    def __init__(self, num): 
     pass 

def singleton(cls): 
    return cls() 

@wrapt.decorator 
def singletonfunction(func): 
    return func() 

@singletonfunction 
def Bit(): 
    """A 1-bit BitField; must be enclosed in a BitStruct""" 
    return BitsInteger(1) 

b = Bit 
print("b.__doc_ :", b.__doc__) 

이 출력을 사용하는 것이 좋습니다 것 Vars() 은 더 이상 BitInteger 유형이 아닙니다. 개인적으로 나는 내가 원하는 것을 즉시 얻을 수 있기 때문에 wrapt를 사용하는 것을 좋아합니다. 해당 기능을 구현하고 모든 엣지 케이스를 처리하는 데는 많은 노력이 필요하며 wrapt는 잘 테스트되고 의도 한대로 작동한다는 것을 알고 있습니다.

+0

기본적으로 'Bit = BitInteger (1)'입니다. 비트 정의에 오타가 있습니다. 클래스가 아니라 인스턴스를 반환합니다. 더 나쁜 것은 PY3에서 작동하는 것 같지 않고/>> 연산자를 상속받지 못합니다. – ArekBulski

+0

나는 이것을 cPython 3.5에서 돌렸다. 'BitsInteger' 클래스의 정의 중 일부를 당신이이 질문에서 성취해야 할 것과 함께 넣을 수 있다면, 여기에서 대답을 향상 시키는데 도움이 될 것입니다. 나는 당신이 해결하려고하는 원래의 문제가 무엇인지 완전히 명확하지 않습니다. 호출 할 수 있고 항상 같은 (싱글 톤) 객체를 반환하려면'Bit'가 필요합니까? – shuttle87

+0

비트는 클래스 인스턴스가 아니며 클래스가 아닌 함수에서 가져온 문서화 문자열입니다. 그게 전부 야. 나는 당신의 솔루션을 받아들입니다. 심지어 때로는 작동합니다. – ArekBulski

관련 문제