etc./StackOverFlow

파이썬에서 객체에 속성이 있는지 확인하는 방법

청렴결백한 만능 재주꾼 2021. 12. 7. 00:50
반응형

질문자 :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 Hardie

Jarret 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()

zweiterlinde

hasattr() 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


batbrat

pydoc에 따르면 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)

Maico

hasattr()을 기대하지만 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 Christians

hasattr() 이 정답입니다. 추가하고 싶은 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

반응형