>

파이썬을 배우고 있습니다. 방금 데코레이터에 대한 자습서를 마쳤습니다. 나는 코드에서 데코레이터를 찾았지만 더 이상하고 낯선 것을 보았습니다.

def state(allowed=['*']):
    def decorator(func):
        func.__fsm_state__ = True
        func.__fsm_allowed__ = allowed
        return func
    if callable(allowed):
        func, allowed = allowed, ['*']
        return decorator(func)
    return decorator

다음 줄이하는 일을 모르겠습니다 :

func, allowed = allowed, ['*']

다른 사람이 설명 할 수 있습니까?

  • 답변 # 1

    이 경우 상태는 데코레이터가 아닌메타 데코레이터또는 데코레이터 생성 함수입니다. 함수에는 직접 적용되지 않지만 다른 것에 적용됩니다. "실제"데코레이터를 반환하는 데 사용할 인수 :

    def a(myargs): # applied to some arguments
        def b(func): # decorator
            do_smth(func, myargs)
        return b # calling a will return the decorator
    @a("world")
    def hello(): # do_smth(hello, "world") is called
        pass
    
    

    입력 할 때

    @state(["something"])
    def foo():
        pass
    
    

    이것은 인수로 [ "something"]을 사용하여 상태 함수를 호출합니다. 그러면 데코레이터 함수가 반환됩니다. 데코레이터 함수는 결국 함수 foo에 적용되어 __fsm_state__ 를 설정합니다.  그리고 __fsm_allowed__  @state에 원래 전달 된 매개 변수에 따라

    대신 사용하는 경우

    @state()
    def foo():
        pass
    
    

    허용 (그리고 차례로 __fsm_allowed__ ) )가 기본값 ["*"] 로 설정됩니다. 상태 함수 선언에서 볼 수 있습니다.

    대괄호를 놓치면, 즉

    @state  # <- no () there
    def foo():
       pass
    
    
    함수 foo는 상태에 대한 매개 변수로 간주됩니다 (따라서 allowed  이 목록 대신 foo입니다. 실제로는 미묘한 버그로 이어질 수 있습니다. 상태를 정의 할 때 확인해야하는 이유가 있습니다

    if callable(allowed):
    
    

    는 foo를 직접 전달하는 실수를 포착하고 기본 인수 ( allowed=["*"] )를 의미한다고 가정합니다. )

    다음 코드

    func, allowed = allowed, ['*'] 
    return decorator(func)
    
    

    어떻게 단순화 할 수 있습니까

    func = allowed
    allowed = ["*"]
    return decorator(func)
    
    
    <올>

    기능을 func에 저장합니다

    인수를 기본값으로 설정하고

    "실제"데코레이터를 함수에 적용

    @state와 @state ()는 이제 정확히 똑같은 일을하는 것을 의미합니다.

    제 생각에 수표는 어설 션이어야하므로 코드에서 이러한 불일치를 신속하게 찾아서 고칠 수는 있지만 자동으로 무시하기로 결정한 사람은 누구든지

  • 답변 # 2

    Also, I dunno what the following line does:

    와이즈 비즈

    약간 쓰는 방법입니다

    func, allowed = allowed, ['*']
    
    

    자세한 내용은 "튜플 할당"을 검색하십시오.

    func = allowed allowed = ['*']

  • 이전 Unable to compile Android app - android 앱을 컴파일 할 수 없습니다 - 코로나의 오류 256
  • 다음 python - 여러 옵션 중 TensorFlow에서 무작위로 옵션 중 하나를 실행하는 방법은 무엇입니까?