변수가 있는지 확인하고 싶습니다. 이제 나는 다음과 같은 일을하고있다 :
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