Jak sprawdzić, czy zmienna istnieje?

Chcę sprawdzić, czy zmienna istnieje. Teraz robię coś takiego:

try:
   myVar
except NameError:
   # Do something.
Czy są inne sposoby bez wyjątków?
Author: martineau, 2009-05-09

10 answers

Aby sprawdzić istnienie zmiennej lokalnej:

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

Aby sprawdzić istnienie zmiennej globalnej:

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

Aby sprawdzić, czy obiekt ma atrybut:

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.
 1139
Author: Ayman Hourieh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-09 13:16:05

Użycie zmiennych, które nie zostały zdefiniowane lub ustawione (w sposób dorozumiany lub jawny) jest prawie zawsze złą rzeczą w dowolnym języku, ponieważ wskazuje, że logika programu nie została prawidłowo przemyślana i prawdopodobnie spowoduje nieprzewidywalne zachowanie.

Następujący trik, który jest podobny do twojego, zapewni, że zmienna ma jakąś wartość przed użyciem:

try:
    myVar
except NameError:
    myVar = None
# Now you're free to use myVar without Python complaining.

Jednak nadal uważam, że to nie jest dobry pomysł - moim zdaniem, ty powinien refaktorować kod tak, aby ta sytuacja nie wystąpiła.

 86
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-11 00:01:21

Prostym sposobem jest zainicjowanie go na początku mówiąc myVar = None

Potem:

if myVar is not None:
    # Do something
 20
Author: Chinedum Ukejianya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 19:42:28

Użycie try / except jest najlepszym sposobem na sprawdzenie istnienia zmiennej. Ale jest prawie na pewno lepszy sposób robienia tego, co robisz, niż ustawianie / testowanie zmiennych globalnych.

Na przykład, jeśli chcesz zainicjować zmienną na poziomie modułu przy pierwszym wywołaniu jakiejś funkcji, lepiej Użyj kodu w następujący sposób:

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...
 17
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-09 13:27:55

Dla obiektów / modułów, można również

'var' in dir(obj)

Na przykład,

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
 13
Author: Wyrmwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 18:39:57

Zakładam, że test będzie użyty w funkcji, podobnej do odpowiedzi user97370 . Nie podoba mi się ta odpowiedź, ponieważ zanieczyszcza globalną przestrzeń nazw. Jednym ze sposobów, aby to naprawić, jest użycie klasy zamiast tego:

class InitMyVariable(object):
  my_variable = None

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

Nie podoba mi się to, ponieważ komplikuje to kod i otwiera pytania typu, czy to powinno potwierdzić schemat programowania Singletona? Na szczęście Python pozwolił funkcjom na posiadanie atrybutów przez jakiś czas, co daje nam to proste rozwiązanie:

def InitMyVariable():
  if InitMyVariable.my_variable is None:
    InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
 8
Author: samwyse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38

catch nazywa się except w Pythonie. poza tym jest w porządku w takich prostych przypadkach. Jest AttributeError można go użyć do sprawdzenia, czy obiekt ma atrybut.

 6
Author: SilentGhost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-09 13:28:06

Sposobem, który często działa dobrze w takich sytuacjach, jest nie sprawdzanie jawnie, czy zmienna istnieje, ale po prostu owiń pierwsze użycie potencjalnie nieistniejącej zmiennej w 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
  ...
 5
Author: Roger Dahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-08 03:05:58

To tylko dodatek do poprzednich odpowiedzi, aby sprawdzić, czy klucz jest obecny w JSON / Dict, czy nie w Pythonie

'Nazwa obiektu Json / Dict'.has_key ('nazwa klucza')

To zwróci True lub False

 4
Author: Arun Ravindranath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-31 04:30:49

Try` '

Myvariable = ['v', 'a', 'r']
try:
    print(Myvariable)
except Nameerror:
    print('variable \"Myvariable\" not found')
Mam nadzieję, że to pomoże!
 -2
Author: F. Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-07 11:43:52