질문자 :Lucas Gabriel Sánchez
파이썬에서 객체에 속성이 있는지 확인하는 방법이 있습니까? 예를 들어:
>>> a = SomeClass() >>> a.someProperty = value >>> a.property Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: SomeClass instance has no attribute 'property'
경우 어떻게 알 수 a
속성이 property
을 사용하기 전에를?
hasattr()
시도:
if hasattr(a, 'property'): a.property
용서를 구하는 것에 대한 좋은 조언을 제공하는 아래 zweiterlinde의 답변을 참조하십시오! 매우 파이썬적인 접근 방식입니다!
파이썬의 일반적인 관행은 속성이 대부분의 시간에 있을 가능성이 있는 경우 단순히 호출하고 예외가 전파되도록 하거나 try/except 블록으로 트래핑하는 것입니다. hasattr
보다 빠를 것입니다. 속성이 대부분의 시간 동안 존재하지 않거나 확실하지 않은 경우 hasattr
을 사용하는 것이 반복적으로 예외 블록에 빠지는 것보다 빠를 것입니다.
Jarret HardieJarret Hardie 가 대답 hasattr
이 트릭을 수행할 것입니다. 그러나 Python 커뮤니티의 많은 사람들이 "도망하기 전에 살펴보기"(LBYL)보다는 "허가보다 용서를 구하는 것이 더 쉬운"(EAFP) 전략을 권장한다고 덧붙이고 싶습니다. 다음 참조를 참조하십시오.
EAFP 대 LBYL (Re: 지금까지는 조금 실망했습니다)
EAFP 대 LBYL @Code Like a Pythonista: 관용적 Python
즉:
try: doStuff(a.property) except AttributeError: otherStuff()
... 선호:
if hasattr(a, 'property'): doStuff(a.property) else: otherStuff()
zweiterlindehasattr()
AttributeError
잡을 수 있지만, 속성 값이 없으면 기본값을 사용하려는 경우 가장 좋은 옵션은 getattr()
을 사용하는 것입니다.
getattr(a, 'property', 'default value')
Carl Meyer나는 당신이 찾고있는 것이 hasattr 이라고 생각합니다. 그러나 파이썬 속성 을 감지하려면 이와 같은 것을 권장합니다.
try: getattr(someObject, 'someProperty') except AttributeError: print "Doesn't exist" else print "Exists"
여기서 단점은 __get__ 속성 코드의 속성 오류도 포착 __get__
그렇지 않으면,
if hasattr(someObject, 'someProp'): #Access someProp/ set someProp pass
문서: http://docs.python.org/library/functions.html
경고:
내가 추천하는 이유는 hasattr이 속성을 감지하지 않기 때문입니다.
링크: http://mail.python.org/pipermail/python-dev/2005-December/058498.html
batbratpydoc에 따르면 hasattr(obj, prop)은 단순히 getattr(obj, prop)을 호출하고 예외를 포착합니다. 따라서 미리 hasattr()을 사용하는 것과 마찬가지로 try 문으로 속성 액세스를 래핑하고 AttributeError를 잡는 것이 유효합니다.
a = SomeClass() try: return a.fake_prop except AttributeError: return default_value
Jordan Lewis나는 이것을 피하는 것이 좋습니다:
try: doStuff(a.property) except AttributeError: otherStuff()
@jpalecek 사용자는 다음과 같이 언급했습니다. doStuff()
AttributeError
가 발생하면 길을 잃습니다.
이 접근 방식이 더 나을 수도 있습니다.
try: val = a.property except AttributeError: otherStuff() else: doStuff(val)
Maicohasattr()을 기대하지만 hasattr()을 피하고 getattr()을 선호하십시오. getattr()은 hasattr()보다 빠릅니다.
hasattr() 사용:
if hasattr(a, 'property'): print a.property
마찬가지로 여기에서 속성이 없으면 속성을 가져오기 위해 getattr을 사용하고 있습니다.
property = getattr(a,"property",None) if property: print property
Janarthanan Ramu편집 : 이 접근 방식에는 심각한 제한이 있습니다. 객체가 반복 가능한 객체인 경우 작동해야 합니다. 아래 댓글을 확인해주세요.
저처럼 Python 3.6 이상을 사용하는 경우 객체에 특정 속성이 있는지 확인하는 편리한 대안이 있습니다.
if 'attr1' in obj1: print("attr1 = {}".format(obj1["attr1"]))
그러나 현재로서는 어떤 접근 방식이 가장 좋은지 잘 모르겠습니다. hasattr()
사용, getattr()
사용 또는 in
사용. 의견을 환영합니다.
nayak상황에 따라 isinstance
어떤 객체를 가지고 있는지 확인하고 해당 속성을 사용할 수 있습니다. Python 2.6/3.0에 추상 기본 클래스 가 도입되면서 이 접근 방식도 훨씬 더 강력해졌습니다(기본적으로 ABC는 더 정교한 오리 타이핑 방식을 허용합니다).
이것이 유용한 한 가지 상황은 두 개의 서로 다른 객체에 이름은 같지만 의미가 다른 속성이 있는 경우입니다. hasattr
만 사용하면 이상한 오류가 발생할 수 있습니다.
한 가지 좋은 예는 반복자와 반복 가능 항목의 구분입니다( 이 질문 참조). iterator와 iterable의 __iter__
메소드는 이름은 같지만 의미적으로는 상당히 다릅니다! 따라서 hasattr
은 쓸모가 없지만 isinstance
는 ABC와 함께 깨끗한 솔루션을 제공합니다.
그러나 대부분의 상황에서 hasattr
접근 방식(다른 답변에 설명됨)이 가장 적절한 솔루션이라는 데 동의합니다.
nikow다음은 매우 직관적인 접근 방식입니다.
if 'property' in dir(a): a.property
Alec이것은 매우 간단합니다. dir(
object )
이렇게 하면 개체의 사용 가능한 모든 기능 및 속성 목록이 반환됩니다.
Sean Christianshasattr()
이 정답입니다. 추가하고 싶은 if
문을 피하고 코드를 더 읽기 쉽게 만들기 hasattr()
을 assert 와 함께 잘 사용할 수도 있다는 것입니다.
assert hasattr(a, 'property'), 'object lacks property'
SO에 대한 다른 답변에 명시된 바와 같이 : Asserts는 절대 발생해서는 안되는 조건을 테스트하는 데 사용해야 합니다. 목적은 손상된 프로그램 상태의 경우 조기에 충돌을 일으키는 것입니다.
F.M.F.hasattr
내장 메소드 object
에 속성이 포함되어 있는지 확인할 수 있습니다.
인스턴스에 대한 개체 인 경우 a
당신은 속성을 확인 할 stuff
>>> class a: ... stuff = "something" ... >>> hasattr(a,'stuff') True >>> hasattr(a,'other_stuff') False
메서드 서명 자체는 hasattr(object, name) -> bool
즉, object
에 속성 hasattr
두 번째 인수로 전달되는 속성이 객체 name
속성의 존재 여부에 따라 부울 True
또는 False
Devang Padhiyar사전이 아닌 객체의 경우:
if hasattr(a, 'property'): a.property
사전의 경우 hasattr()
이 작동하지 않습니다.
has_key()
를 사용하라고 말하고 있지만, 그것은 감가상각됩니다. 따라서 사전의 경우 has_attr()
if a.has_attr('property'): a['property']
Shashi또 다른 가능한 옵션이지만 이전에 의미하는 바에 따라 다릅니다.
undefined = object() class Widget: def __init__(self): self.bar = 1 def zoom(self): print("zoom!") a = Widget() bar = getattr(a, "bar", undefined) if bar is not undefined: print("bar:%s" % (bar)) foo = getattr(a, "foo", undefined) if foo is not undefined: print("foo:%s" % (foo)) zoom = getattr(a, "zoom", undefined) if zoom is not undefined: zoom()
산출:
bar:1 zoom!
이를 통해 값이 없는 속성도 확인할 수 있습니다.
하지만! undefined
여러 위치를 실수로 인스턴스화하고 비교하지 않도록 매우 주의하십시오. 이 경우 is
업데이트:
일치하지 않는 여러 정의되지 않은 항목이 있는 위의 단락에서 경고한 내용 때문에 최근에 이 패턴을 약간 수정했습니다.
undefined = NotImplemented
NotImplemented
NotImplementedError
와 혼동하지 않도록 undefined
JS의 의도와 반일치하고 해당 정의를 어디에서나 재사용할 수 있으며 항상 일치합니다. 단점은 부울에서 "진실"이고 로그 및 스택 추적에서 이상하게 보일 수 있다는 것입니다(그러나 이 컨텍스트에서만 나타나는 것을 알면 빠르게 극복할 수 있습니다).
JL Peyret참조하는 객체가 'dict'이면 hasattr 이 작동하지 않는다는 점에 유의해야 합니다.
hasattr 은 사전의 구성원을 테스트하지 않습니다. 대신 in 연산자를 사용하거나 has_key 메소드를 사용하십시오.
d = {'a': 1} d.has_key('a') #True 'a' in d #True
AnandShiva출처 : http:www.stackoverflow.com/questions/610883/how-to-know-if-an-object-has-an-attribute-in-python