실제로 예외가 얼마나 자주 발생한다고 생각 하느냐에 달려 있습니다.
제 생각에는 두 가지 접근 방식 모두 최소한 가독성과 파이썬 성 측면에서 똑같이 유효합니다. 그러나 객체의 90 %에 속성 이 없는 경우 bar
두 접근 방식간에 성능 차이가 뚜렷하게 나타납니다.
>>> import timeit
>>> def askforgiveness(foo=object()):
... try:
... x = foo.bar
... except AttributeError:
... pass
...
>>> def askpermission(foo=object()):
... if hasattr(foo, 'bar'):
... x = foo.bar
...
>>> timeit.timeit('testfunc()', 'from __main__ import askforgiveness as testfunc')
2.9459929466247559
>>> timeit.timeit('testfunc()', 'from __main__ import askpermission as testfunc')
1.0396890640258789
그러나 객체의 90 %에 속성 이 있으면 테이블이 설정됩니다.
>>> class Foo(object):
... bar = None
...
>>> foo = Foo()
>>> timeit.timeit('testfunc(foo)', 'from __main__ import askforgiveness as testfunc, foo')
0.31336188316345215
>>> timeit.timeit('testfunc(foo)', 'from __main__ import askpermission as testfunc, foo')
0.4864199161529541
따라서 성능 관점에서 상황에 가장 적합한 접근 방식을 선택해야합니다.
결국, timeit
모듈을 전략적으로 사용하는 것이 가장 파이썬적인 일일 수 있습니다.