Python globals, местные жители и UnboundLocalError

Я нашел решение, как описано на странице ниже, controlName не для отдельных элементов управления, а для оконных элементов управления, таких как WinWindow.

https://blogs.msdn.microsoft.com/vstsqualitytools/2010/01/15/understanding-the-window-search-and-windowed-properties/

8
задан cdleary 1 January 2009 в 10:03
поделиться

4 ответа

Похож на Python, видит from pprint import pprint строка и метки pprint как имя, локальное для main() прежде, чем выполнить любой код. Так как Python думает, что печать должна быть локальной переменной, сославшись на него с pprint.pprint() прежде, чем "присвоить" его с from..import оператор, это бросает ту ошибку.

Это - столько смысла, сколько я могу сделать из этого.

Мораль, конечно, должна всегда помещать их import операторы во главе объема.

4
ответ дан 5 December 2019 в 08:54
поделиться

Где удивление? Любая переменная, глобальная к объему, который Вы повторно присваиваете в том объеме, отмечена локальная для того объема компилятором.

Если бы импорт был бы обработан по-другому, который был бы удивителен, по моему скромному мнению.

Это может изложить доводы для того, чтобы не называть модули после того, как символы использовали там, или наоборот, все же.

6
ответ дан 5 December 2019 в 08:54
поделиться

Ну, это было достаточно интересно, чтобы я экспериментировал немного, и я прочитал http://docs.python.org/reference/executionmodel.html

Затем сделал некоторое переделывание Вашего кода тут и там, это - то, что я мог найти:

код:

import pprint

def two():
    from pprint import pprint
    print globals()['pprint']
    pprint('Eggs')
    print globals()['pprint']

def main():
    if 'pprint' in globals():
        print 'pprint is in globals()'
    global  pprint
    print globals()['pprint']
    pprint.pprint('Spam')
    from pprint import pprint
    print globals()['pprint']
    pprint('Eggs')

def three():
    print globals()['pprint']
    pprint.pprint('Spam')

if __name__ == '__main__':
    two()
    print('\n')
    three()
    print('\n')
    main()

вывод:

<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Eggs'
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>

<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Spam'

pprint is in globals()
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Spam'
<function pprint at 0xb7d596f4>
'Eggs'

В методе two() from pprint import pprint но не переопределяет имя pprint в globals, начиная с global ключевое слово не используется в пределах two().

В методе three() с тех пор нет никакого объявления pprint имя в локальном объеме это принимает значение по умолчанию к глобальному имени pprint который является модулем

Принимая во внимание, что в main(), сначала ключевое слово global используется так все ссылки на pprint в пределах метода main() будет относиться к global имя: pprint. Который, как мы видим, является модулем сначала и переопределяется в global namespace с методом, как мы делаем from pprint import pprint

Хотя это не может отвечать на вопрос как таковой, но тем не менее его некоторый интересный факт, я думаю.

=====================

Отредактируйте Другую интересную вещь.

Если у Вас есть модуль, скажите:

mod1

from datetime import    datetime

def foo():
    print "bar"

и в другом методе говорится:

mod2

import  datetime
from mod1 import *

if __name__ == '__main__':
    print datetime.datetime.now()

который на первый взгляд на вид корректен, так как Вы импортировали модуль datetime в mod2.

теперь, при попытке выполнить mod2 как сценарий, то он бросит ошибку:

Traceback (most recent call last):
  File "mod2.py", line 5, in <module>
    print datetime.datetime.now()
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'

потому что второй импорт from mod2 import * переопределил имя datetime в пространстве имен, следовательно первое import datetime больше не допустимо.

Мораль: Таким образом порядок импорта, природа импорта (от x импортируют *), и осведомленность об импорте в импортированных модулях - вопросы.

5
ответ дан 5 December 2019 в 08:54
поделиться

Этот вопрос получил ответ несколько недель назад, но Я думаю, что я могу уточнить ответы немного. Сначала некоторые факты.

1: в Python

import foo

почти точно так же, как

foo = __import__("foo", globals(), locals(), [], -1)

2: при выполнении кода в функции, если Python сталкивается с переменной, которая еще не определена в функции, она выглядит в глобальном сфера.

3: Python имеет оптимизацию, которую он использует для функций, называемых «Local». Когда Python тоненяет функцию, он отслеживает все переменные, которые вы назначаете. Он присваивает каждому из этих переменных число от локального монотонного увеличения целого числа. Когда Python запускает функцию, она создает массив с столькими слотами, поскольку есть локальные переменные, и он назначает каждому слоту специальное значение, которое означает «не было назначено», и именно здесь хранятся значения для этих переменных. Если вы ссылаетесь на локальный, который еще не был назначен, Python видит, что это особое значение и бросает исключение разблокировку.

Теперь этап устанавливается. Ваш «от PPRINT Import PPRINT» действительно является формой назначения. Таким образом, Python создает локальную переменную под названием «PPRINT», которая окклюзирует глобальную переменную. Затем, когда вы ссылаетесь на «PPRINT.PPRINT» в функции, вы попали в специальное значение, и Python бросает исключение. Если у вас не было этого оператора импорта в функции, Python будет использовать разрешение обычных Local Intain-First-In-Globals и найдите модуль PPRINT в глобалях.

Чтобы убедиться, что вы можете использовать ключевое слово «Global». Конечно, теперь вы уже работали по своей проблеме, и я не знаю, действительно ли вы нуждались в «глобальном» или, если был призван какой-то другой подход.

4
ответ дан 5 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: