2016-07-26 1 views
3

이것이 예상되는 동작 인 경우에는 getattr built_in 메서드인지 확인하지 못합니다. getattr은 실제 인수 (2nd)가 조건을 충족시키는 경우에도 기본 (3rd) 인수를 실행합니다. 예 :python getattr built_in 메서드가 기본 인수를 실행합니다.

def func(): 
     print 'In Function' 

    class A: 
     def __init__(self): 
      self.param = 12 

    a = A() 

내가 getattr(a, 'param', Func())를 실행하면 그 결과를 제공합니다. 내가 원하지 않는 In Function을 적어 두십시오. 내가 getattr(a, 'param1', func()) 즉 출력

In Function 

을 실행하지만 난 단지 조건을 만족하는 경우 12로 결과 할 때

In Function 
12 

는하지만 완벽하게 잘 작동합니다. 제발 왜 getattr이 그런 행동을하는지 알려주세요. 제 2 인자가 있다면 제 3의 arg를 실행하지 않아도됩니다.) Pythonic 방식으로 그것을하는 다른 방법을 공유하면 감사하겠습니다. 먼저 마음에 떠오르는 한 가지는 hasattr을 사용하여 param1이 존재하는지 확인한 다음 필요한 조치를 취하는 것입니다.

답변

5

getattr이 실행되기 전에 전달 된 모든 매개 변수를 평가해야합니다. func()은 이러한 매개 변수 중 하나이며이를 평가하려고 시도하면 print 문이 실행됩니다. 속성을 찾을 지 여부와 상관없이 func()은 반드시 apriori로 평가해야합니다.

이것은 getattr과 다르지 않습니다. 이것은 함수와 해당 매개 변수가 파이썬에서 작동하는 방식입니다.

>>> def does_nothing(any_arg): pass 
... 
>>> def f(): print("I'll get printed") 
... 
>>> 
>>> does_nothing(f()) 
I'll get printed 

기능 does_nothing 실제로 전달 된 매개 변수와 함께 아무것도하지 않는 :


는 다음과 같은 고려하십시오. 그러나 함수 호출이 완료되기 전에 매개 변수를 평가해야합니다.


print 문은 그러나 getattr의 결과에 영향을주지 않습니다; 일종의 부작용. 속성을 찾을 수없는 경우 함수의 값이 return입니다.

+0

나는 이것이 여분의 함수를 추가하는 오버 헤드가 될 것이라고 생각하고 대신'hasattr' 검사와 함께 가야한다고 생각합니다. 그럼에도 불구하고 고마워. – MaNKuR

+4

'a'가 attr'param'을 가질 때'func()'가 평가되지 않게하려면'getattr (a, 'param', None) 또는 func()'로 변경할 수 있습니다. '또는'다음에 유효한 코드는 * lazy *가됩니다. –

+0

Thanks @ Chang.Jian, 이것은 유용한 트릭입니다. 어떻게 내가 이것을 놓칠 수 있습니다. – MaNKuR

관련 문제