2014-02-11 3 views
0

В Python это возможно, чтобы избежать переменной (предварительно) декларацию, чтобы избежать NameError: имя «с» не определен:Python Обработка необъявленных переменных

a=5 
if a==7: 
    c=10 
if c: print c 

На последней строке если c: просто проверяет, является ли переменная 'c' не является ничем. Что можно использовать для проверки того, существует ли переменная 'c' (или была предварительно объявлена)?

+1

Если с только существует, когда первый 'if' исполняет, почему бы не поставить' печать c' внутри этого блока 'if'? – Kevin

ответ

7

Конечно, назначить None к нему первым:

a = 5 
c = None 
if a == 7: 
    c = 10 
if c: 
    print c 

None испытания как False в логическом контексте, так if c: до сих пор работает, как написано.

Вы также могли поймать NameError исключение:

try: 
    print c 
except NameError: 
    pass 

или использовать globals() и locals() функции:

if 'c' in locals(): 
    # in a function 

if 'c' in globals(): 
    # outside a function 

но это просто некрасиво и ненужно.

+0

Интересно, могу ли я избежать c = Нет предварительной декларации .... Любые другие предложения? – alphanumeric

+1

@Sputnix: Почему? Вы можете попробовать и посмотреть, доступно ли имя в 'globals()' или 'locals()', но это просто уродливо. К какой цели следует «c» не быть назначенным? –

+0

Дело в том, что если вы не знаете, было ли имя определено или нет, возможно, существует проблема с вашим кодом. Хороший код состоит из небольших простых функций и позволяет избежать скольжения, насколько это возможно, поэтому вы не знаете. Если вы этого не сделаете, переформатируйте свой код. –

3

Вы можете использовать locals, чтобы проверить, если переменная находится в локальной области видимости:

>>> c = 1 
>>> locals() 
{'__doc__': None, 'c': 1, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__', '__package__': None} 
>>> 'c' in locals() 
True 
>>> 

Вы также можете быть заинтересованы в globals.

6

Вы можете поймать исключение.

+0

это кажется лучшим ответом, на мой взгляд, я использую это для извлечения участников из файла конфигурации и обеспечения правильной настройки. –

1

Не понятно, почему вам потребуется переменная при определенных обстоятельствах и не другие, но самая простая вещь, чтобы переместить print в область c назначается в:

if a == 7: 
    c = 10 
    print(c) 

или к удалить эту переменную:

if a == 7: 
    print(10) 
0

В Python3 и, несмотря на Мартейн думать, что это некрасиво:
Если вы знаете, что переменная является глобальной:

if globals().get('abc'): print (True) 

, если вы знаете, что это местные:

if locals().get('abc'): print (True) 
Смежные вопросы