[python] 변수가 존재하는지 어떻게 확인합니까?

변수가 있는지 확인하고 싶습니다. 이제 나는 다음과 같은 일을하고있다 :

try:
   myVar
except NameError:
   # Do something.

예외없이 다른 방법이 있습니까?



답변

지역 변수가 있는지 확인하려면 :

if 'myVar' in locals():
  # myVar exists.

전역 변수가 있는지 확인하려면 다음을 수행하십시오.

if 'myVar' in globals():
  # myVar exists.

객체에 속성이 있는지 확인하려면

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.


답변

사용 정의되거나 (암시 적 또는 명시 적으로) 설정에 아직 변수는 거의 항상에서 나쁜 일이 어떤 종종 프로그램의 논리가 제대로을 통해 생각되지 않았 음을 나타냅니다, 그리고 결과에 가능성이 있기 때문에, 언어 예측할 수없는 행동으로

이 경우 필요 파이썬에서 그것을 할, 당신과 유사 다음과 같은 트릭은 변수가 있는지 확인합니다 일부 사용하기 전에 값을 :

try:
    myVar
except NameError:
    myVar = None

# Now you're free to use myVar without Python complaining.

그러나 여전히 좋은 생각이라고 확신하지 못합니다. 제 생각 에이 상황이 발생하지 않도록 코드를 리팩터링해야합니다.


답변

간단한 방법은 처음에 말을 초기화하는 것입니다 myVar = None

그런 다음 나중에 :

if myVar is not None:
    # Do something


답변

try / except를 사용하는 것이 변수의 존재를 테스트하는 가장 좋은 방법입니다. 그러나 전역 변수를 설정 / 테스트하는 것보다 현재하고있는 일을하는 것이 더 좋은 방법이 거의 있습니다.

예를 들어, 함수를 처음 호출 할 때 모듈 수준 변수를 초기화하려면 다음과 같은 코드를 사용하는 것이 좋습니다.

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...


답변

객체 / 모듈의 경우

'var' in dir(obj)

예를 들어

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False


답변

테스트가 user97370의 답변 과 비슷한 함수에서 사용된다고 가정합니다 . 글로벌 네임 스페이스를 오염시키기 때문에 그 대답을 좋아하지 않습니다. 이를 해결하는 한 가지 방법은 클래스를 대신 사용하는 것입니다.

class InitMyVariable(object):
  my_variable = None

def __call__(self):
  if self.my_variable is None:
   self.my_variable = ...

코드를 복잡하게 만들고 Singleton 프로그래밍 패턴을 확인 해야하는지와 같은 질문을하기 때문에 이것을 좋아하지 않습니다. 다행스럽게도 파이썬은 함수가 잠시 동안 속성을 가질 수있게 해주었습니다.

def InitMyVariable():
  if InitMyVariable.my_variable is None:
    InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None


답변

catchexcept파이썬에서 호출 됩니다. 그 외에는 간단한 경우에 좋습니다. 있다 AttributeError객체 속성을 가지고 있는지 확인하는 데 사용할 수있는.