Development Tip

변수가 있는지 어떻게 확인합니까?

yourdevel 2020. 9. 28. 10:22
반응형

변수가 있는지 어떻게 확인합니까?


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

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.

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

Python에서 수행 해야하는 경우 다음과 유사한 트릭 을 사용하면 사용하기 전에 변수에 어떤이 있는지 확인할 수 있습니다.

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

I will assume that the test is going to be used in a function, similar to user97370's answer. I don't like that answer because it pollutes the global namespace. One way to fix it is to use a class instead:

class InitMyVariable(object):
  my_variable = None

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

I don't like this, because it complicates the code and opens up questions such as, should this confirm to the Singleton programming pattern? Fortunately, Python has allowed functions to have attributes for a while, which gives us this simple solution:

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

catch is called except in Python. other than that it's fine for such simple cases. There's the AttributeError that can be used to check if an object has an attribute.


A way that often works well for handling this kind of situation is to not explicitly check if the variable exists but just go ahead and wrap the first usage of the possibly non-existing variable in a try/except NameError:

# Search for entry.
for x in y:
  if x == 3:
    found = x

# Work with found entry.
try:
  print('Found: {0}'.format(found))
except NameError:
  print('Not found')
else:
  # Handle rest of Found case here
  ...

참고URL : https://stackoverflow.com/questions/843277/how-do-i-check-if-a-variable-exists

반응형