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


953

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

try:
   myVar
except NameError:
   # Do something.

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


15
예외적으로 무엇이 문제입니까?
S.Lott 2016 년

10
@ S.Lott : myVar정말 복잡한 것이거나 생산 / 평가에 오랜 시간이 걸리는 경우 try속도가 느려 지지 않습니까?
dbliss

3
@dbliss : 변수입니다. 정말 이상한 경우를 제외하고는 미친 exec클래스 나 메타 클래스를 수행하는 경우 비용이 많이 들지 않습니다.
user2357112는

답변:


1627

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

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

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

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

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

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

29
좋아, 클래스에 존재하는 속성을 어떻게 확인할 수 있습니까?
Max Frai 2016 년

7
존재하지 않는 변수의 이름을 어떻게 문자열로 바꾸나요?
SilentGhost

15
그러나 OP는 코드를 입력하고 있으며 myVar 대신 'myVar'을 입력 할 수 있습니다. 코드를 작성할 때 변수 이름을 알 수 없으면 런타임에 문자열 변수에 저장되며 게시 한 검사도 작동합니다.
Ayman Hourieh

8
내장 변수와 중첩 함수가있는 경우 외부 범위의 변수도 있습니다. 모든 것을 확인하려면 NameError결국 트리거하는 것이 가장 좋습니다 .
Petr Viktorin 2016 년

14
if hasattr(obj, 'attr_name'):수업에도 잘 맞는 것을 가장 좋아했습니다 . 즉if hasattr(self, 'attr_name'):
Ron Kalian

118

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

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

try:
    myVar
except NameError:
    myVar = None

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

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


8
어쩌면 그것은 의존성의 변수 일 수 있으며 버전 / 플랫폼에 따라 존재하거나 존재하지 않을 수 있으며 어떤 버전인지 알 수있는 다른 방법이 없습니다.
WhyNotHugo

35
상태 변수는 할당되기 전에 존재하지 않습니다. 이전 위치에서 현재 위치로 선을 그린 다음 이전 = 현재를 설정한다고해서 첫 번째 호출에서 "변수를 모른다"는 것은 아닙니다. 그리고 draw 루틴 외부에서 previous = null을 초기화하기 위해 추가 코드 줄을 작성한다고해서 변수를 더 잘 알 수있는 것은 아닙니다.
Dave

4
내 요점은 "마지막으로 : draw (last, current); last = current"블록은 이해하기 쉽고 프로그래밍이 좋지 않다는 것입니다. 테스트하기 전에 "마지막"이 있는지 확인하기 위해 "시도 / 제외"를 추가하면 해당 코드의 가독성이 떨어집니다.
Dave

23
"정의되지 않은 변수의 사용은 실제로 어떤 언어에서나 나쁜 것입니다." 우리 중 일부는 Matlab처럼 작동하는 Spyder와 같은 IDE를 사용하여 간단한 수학 또는 통계 스크립트에 Python을 사용합니다. 이러한 환경에서는 사용자가 글로벌 콘솔에서 변수를 정의하고 Matlab에서 수학을 수행 할 때와 같이 스크립트에서 변수가 선언되지 않았는지 확인하는 것이 때때로 의미가 있습니다.
Ricardo Cruz

15
적어도에 @Ricardo는, 아마도, 오히려 그것의 겸손을 가정보다, 당신은 할 수 있습니다 고려할 수있는 가능성을 누군가에서 단지 좋은 충고 있다고 할 수있다 지식이 될 수는 :-) 또는 당신은 내가 세계의 제약 사용에 대해 조언한다면 똑같이 애용 고려할 것 변수, 스파게티 코드, 신 개체, 테스트되지 않은 코드 공개 또는 COBOL로 운영 체제 작성? 내 대답은 왜 그것이 나쁜 생각이라고 생각했는지 (그리고 OP가 왜 필요하다고 생각했는지 질문에 아무것도 없었 음) 진술했지만 여전히 그들이 원했던 오프 기회에 대한 방법을 제공했습니다.
paxdiablo

52

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

그런 다음 나중에 :

if myVar is not None:
    # Do something

2
이 답변에서 개선해야 할 것이 많이 있습니다. 오히려-간단한 방법은 먼저 선언하는 것입니다. myVar = none # do stuff... if not myVar: # give myVar a value myVar = 'something'
Shawn Mehan

나는 내 except진술 에서
아무것도

왜 그런지 모르겠습니다 : if myVar: # Do something 이렇게하면 이중 부정을 읽을 필요가 없습니다
jjisnow

@jjisnow myVar빈리스트, 0, 빈 문자열 등 이더라도이 조건을 만족 시키려면
Gabriel

7
myVar가 선언되지 않은 경우 @jjisnow if myVar: # Do somethingNameErrorpython3에 던집니다
Agile Bean

25

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

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

my_variable = None

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

2
전역 네임 스페이스를 오염시키기 때문에 이것을 사용하지 마십시오. 이것을 피하는 한 가지 방법은 my_variable을 클래스 변수로 사용하고 호출 을 기존 함수의 본문으로 정의하는 함수를 클래스로 만드는 것 입니다. 함수 속성을 선호합니다 (아래 참조).
samwyse

17

객체 / 모듈의 경우

'var' in dir(obj)

예를 들어

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

11

테스트가 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

9

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


5

이런 종류의 상황을 처리하는 데 종종 잘 작동하는 방법은 변수가 존재하는지 명시 적으로 확인하지 않고 계속 시도하여 존재하지 않는 변수의 첫 번째 사용법을 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
  ...

3

커스텀 함수를 만들었습니다.

def exists(var):
     var_exists = var in locals() or var in globals()
     return var_exists

그런 다음 variable_name확인하려는 변수로 대체 하여 다음과 같은 함수를 호출 하십시오.

exists("variable_name")

돌아 True오거나False


2
아니요, 작동하지 않습니다. locals()is ... err ... 로컬 함수 exists😅
bgusach

1
1) locals () 함수는 로컬입니다. 2) 왜 var_의 추가 할당이 존재합니까?
데이브
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.