Rectangle 27 1

Determine if variable is defined in Python?


try:
  thevariable
except NameError:
  print "well, it WASN'T defined after all!"
else:
  print "sure, it was defined."

@Aaron, "should" is a 4-letter word -- e.g. no driver "should" ever exceed the speed limit, but that doesn't mean you don't take all proper and needed precautions against those who nevertheless do. Maintaining fragile, undertested legacy code with somewhat-broken design that you inherited from somebody else is a fact of life, and those who can only think of big-bang rewriting from scratch rather than cautiously and incrementally need to re-read Joel's 9-years-old essay joelonsoftware.com/articles/fog0000000069.html .

@Aaron: There are many cases when you don't know whether variable is defined. You can refactor code to avoid this in many, but not all cases. Alex's solution is correct and it the best when refactoing is not possible for some reasons. There is not much information in the question, so I believe only person asked it can select the best way to handle his case.

@S.Lott People use it to maintain backwards compatibility. Search for NameError in Python 3.1 source code. There are many instances where "try: var_name except NameError: something_else" is used. Here are a couple of place where it is used: CSV (svn.python.org/projects/python/trunk/Lib/csv.py) library and in the ElementTree library (svn.python.org/projects/python/trunk/Lib/xml/etree/).

Exceptions should be reserved for exceptional cases, not for use as the bastard brother of 'if' :-(

This debate is much more interesting that the answer itself, which by the way is 100% correct and let you handle poor legacy code elegantly.

Note
Rectangle 27 1

Determine if variable is defined in Python?


For this particular case it's better to do a = None instead of del a. This will decrement reference count to object a was (if any) assigned to and won't fail when a is not defined. Note, that del statement doesn't call destructor of an object directly, but unbind it from variable. Destructor of object is called when reference count became zero.

Note
Rectangle 27 1

Determine if variable is defined in Python?


If you are using finally block to close connections but in the try block, the program exits with sys.exit() before the connection is defined. In this case, the finally block will be called and the connection closing statement will fail since no connection was created.

Note
Rectangle 27 1

Determine if variable is defined in Python?


try:
    a # does a exist in the current namespace
except NameError:
    a = 10 # nope

@einpoklum This is true for most languages, but in Python exceptions are used more often, see e.g. stackoverflow.com/questions/3086806

Better use the if 'a' in vars() or 'a' in globals() solution mentioned above, which does not require an exception

Exceptions should only be used in exceptional cases. See this discussion

Hmm, strange but true, apparently. I still think that's not a Good Idea (TM) but, well, can't argue with community customs.

Note
Rectangle 27 1

Determine if variable is defined in Python?


@DevinJeanpierre That's not necessarily true. If you want to create some client library for a JSON API that treats a null value as different from an unspecified value (eg. None sets the actual JSON value to null, whereas an unspecified leaves it out of the JSON message entirely, which makes the API use a default or calculate from other attributes), you need to either differentiate None from Undefined, or None from JSON null. It's incredibly short-sighted to think that None can't or shouldn't ever be used as distinct from a value that is explicitly unspecified or undefined.

@Taywee sure. "Using a non-None value is useful if None can come up in an assignment and so on, but this is not so common that avoiding None should be standard practice." If a non-None value can come up, then None is not acceptable, and this whole pattern is error-prone.

If you like to do it that way you should make the initial value unique so you can distinguish from something setting a to None ie. UNDEFINED=object();a=UNDEFINED then you can test with a is not UNDEFINED

This is THE way, not sure why people think using a LONG and DIRTY try/except construct to get this done. ALSO this is very useful when using keyword args in class member functions where you don't want to hard-code the default values into the parameter list (you just define the default value as a class member).

This is a common use of None. It's literally the semantic meaning of None-- it's nothing, nada, zip. It exists, but has "no value". Using a non-None value is useful if None can come up in an assignment and so on, but this is not so common that avoiding None should be standard practice. For example, in the question, a would only ever be 42 or undefined. Changing undefined to having a value of None results in no loss of information.

Note
Rectangle 27 1

Determine if variable is defined in Python?


try:
  thevariable
except NameError:
  print "well, it WASN'T defined after all!"
else:
  print "sure, it was defined."

@Aaron, "should" is a 4-letter word -- e.g. no driver "should" ever exceed the speed limit, but that doesn't mean you don't take all proper and needed precautions against those who nevertheless do. Maintaining fragile, undertested legacy code with somewhat-broken design that you inherited from somebody else is a fact of life, and those who can only think of big-bang rewriting from scratch rather than cautiously and incrementally need to re-read Joel's 9-years-old essay joelonsoftware.com/articles/fog0000000069.html .

@Aaron: There are many cases when you don't know whether variable is defined. You can refactor code to avoid this in many, but not all cases. Alex's solution is correct and it the best when refactoing is not possible for some reasons. There is not much information in the question, so I believe only person asked it can select the best way to handle his case.

@S.Lott People use it to maintain backwards compatibility. Search for NameError in Python 3.1 source code. There are many instances where "try: var_name except NameError: something_else" is used. Here are a couple of place where it is used: CSV (svn.python.org/projects/python/trunk/Lib/csv.py) library and in the ElementTree library (svn.python.org/projects/python/trunk/Lib/xml/etree/).

@einpoklum, Python uses exception StopIteration within just about every for statement -- that's how an iterator lets it known that it's all done. And of course, it is far from "an exceptional case" for iteration to be done -- indeed, one expects most iterations to terminate. Thus, obviously, your opinions on how exceptions "should" be used are not correctly applicable to Python (other languages have different pragmatics and the question cannot be properly treated as "language agnostic" as in the Q you point to).

This debate is much more interesting that the answer itself, which by the way is 100% correct and let you handle poor legacy code elegantly.

Note
Rectangle 27 1

Determine if variable is defined in Python?


This is a very idiomatic answer. There is a strong use case here for maps; for example, if "prop2" in {"prop0": None, "prop1": None}:

Note
Rectangle 27 1

Determine if variable is defined in Python?


try:
  thevariable
except NameError:
  print "well, it WASN'T defined after all!"
else:
  print "sure, it was defined."

@Aaron, "should" is a 4-letter word -- e.g. no driver "should" ever exceed the speed limit, but that doesn't mean you don't take all proper and needed precautions against those who nevertheless do. Maintaining fragile, undertested legacy code with somewhat-broken design that you inherited from somebody else is a fact of life, and those who can only think of big-bang rewriting from scratch rather than cautiously and incrementally need to re-read Joel's 9-years-old essay joelonsoftware.com/articles/fog0000000069.html .

@Aaron: There are many cases when you don't know whether variable is defined. You can refactor code to avoid this in many, but not all cases. Alex's solution is correct and it the best when refactoing is not possible for some reasons. There is not much information in the question, so I believe only person asked it can select the best way to handle his case.

@S.Lott People use it to maintain backwards compatibility. Search for NameError in Python 3.1 source code. There are many instances where "try: var_name except NameError: something_else" is used. Here are a couple of place where it is used: CSV (svn.python.org/projects/python/trunk/Lib/csv.py) library and in the ElementTree library (svn.python.org/projects/python/trunk/Lib/xml/etree/).

@einpoklum, Python uses exception StopIteration within just about every for statement -- that's how an iterator lets it known that it's all done. And of course, it is far from "an exceptional case" for iteration to be done -- indeed, one expects most iterations to terminate. Thus, obviously, your opinions on how exceptions "should" be used are not correctly applicable to Python (other languages have different pragmatics and the question cannot be properly treated as "language agnostic" as in the Q you point to).

This debate is much more interesting that the answer itself, which by the way is 100% correct and let you handle poor legacy code elegantly.

Note
Rectangle 27 1

Determine if variable is defined in Python?


For this particular case it's better to do a = None instead of del a. This will decrement reference count to object a was (if any) assigned to and won't fail when a is not defined. Note, that del statement doesn't call destructor of an object directly, but unbind it from variable. Destructor of object is called when reference count became zero.

Note
Rectangle 27 1

Determine if variable is defined in Python?


For this particular case it's better to do a = None instead of del a. This will decrement reference count to object a was (if any) assigned to and won't fail when a is not defined. Note, that del statement doesn't call destructor of an object directly, but unbind it from variable. Destructor of object is called when reference count became zero.

Note