변수가 있는지 확인하고 싶습니다. 이제 나는 다음과 같은 일을하고있다 :
try:
myVar
except NameError:
# Do something.
예외없이 다른 방법이 있습니까?
myVar
정말 복잡한 것이거나 생산 / 평가에 오랜 시간이 걸리는 경우 try
속도가 느려 지지 않습니까?
exec
클래스 나 메타 클래스를 수행하는 경우 비용이 많이 들지 않습니다.
변수가 있는지 확인하고 싶습니다. 이제 나는 다음과 같은 일을하고있다 :
try:
myVar
except NameError:
# Do something.
예외없이 다른 방법이 있습니까?
myVar
정말 복잡한 것이거나 생산 / 평가에 오랜 시간이 걸리는 경우 try
속도가 느려 지지 않습니까?
exec
클래스 나 메타 클래스를 수행하는 경우 비용이 많이 들지 않습니다.
답변:
지역 변수가 있는지 확인하려면 :
if 'myVar' in locals():
# myVar exists.
전역 변수가 있는지 확인하려면 다음을 수행하십시오.
if 'myVar' in globals():
# myVar exists.
객체에 속성이 있는지 확인하려면
if hasattr(obj, 'attr_name'):
# obj.attr_name exists.
NameError
결국 트리거하는 것이 가장 좋습니다 .
if hasattr(obj, 'attr_name'):
수업에도 잘 맞는 것을 가장 좋아했습니다 . 즉if hasattr(self, 'attr_name'):
사용 정의되거나 (암시 적 또는 명시 적으로) 설정에 아직 변수는 거의 항상에서 나쁜 일이 어떤 종종 프로그램의 논리가 제대로을 통해 생각되지 않았 음을 나타냅니다, 그리고 결과에 가능성이 있기 때문에, 언어 예측할 수없는 행동으로
이 경우 필요 파이썬에서 그것을 할, 당신과 유사 다음과 같은 트릭은 변수가 있는지 확인합니다 일부 사용하기 전에 값을 :
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
myVar = none # do stuff... if not myVar: # give myVar a value myVar = 'something'
except
진술 에서
if myVar: # Do something
이렇게하면 이중 부정을 읽을 필요가 없습니다
myVar
빈리스트, 0, 빈 문자열 등 이더라도이 조건을 만족 시키려면
if myVar: # Do something
는 NameError
python3에 던집니다
try / except를 사용하는 것이 변수의 존재를 테스트하는 가장 좋은 방법입니다. 그러나 전역 변수를 설정 / 테스트하는 것보다 현재하고있는 일을하는 것이 더 좋은 방법이 거의 있습니다.
예를 들어, 함수를 처음 호출 할 때 모듈 수준 변수를 초기화하려면 다음과 같은 코드를 사용하는 것이 좋습니다.
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
테스트가 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
catch
except
파이썬에서 호출 됩니다. 그 외에는 간단한 경우에 좋습니다. 있다 AttributeError
객체 속성을 가지고 있는지 확인하는 데 사용할 수있는.
이런 종류의 상황을 처리하는 데 종종 잘 작동하는 방법은 변수가 존재하는지 명시 적으로 확인하지 않고 계속 시도하여 존재하지 않는 변수의 첫 번째 사용법을 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
...
커스텀 함수를 만들었습니다.
def exists(var):
var_exists = var in locals() or var in globals()
return var_exists
그런 다음 variable_name
확인하려는 변수로 대체 하여 다음과 같은 함수를 호출 하십시오.
exists("variable_name")
돌아 True
오거나False
locals()
is ... err ... 로컬 함수 exists
😅