Я нахожу очень полезным быть в состоянии создать новые переменные во время времени выполнения и создать словарь результатов для обработки позже, т.е. записи в файл:
myDict = {}
for i in range (1,10):
temp = "variable"+str(i)
vars()[temp] = myFunctionThatReturnsData() # variable1= data1, variable2 = data2,etc.
myDict[temp] = vars(temp)
который создает словарную статью [result1:data1], которую я могу назвать с myDict[result1]. Я использовал Вар (), действительно не понимая то, что я делаю. Я беру его vars()
возвращает словарь с локальными переменными (?), и
Вар () [x] = y
создает новую словарную статью [x:y]?
У меня есть сценарий, куда я передаю в словаре, подготовленном с {input1:data1, input2:data2}, и я использую этот метод, чтобы выполнить итерации через все значения, сохранить все результаты и произвести его в файл. Этот бит кода в функции в классе и работает.
Мой источник беспорядка - то, что я прочитал различные сообщения о том, как местные жители () не должны быть смешаны с, и как Вар () эквивалентен (?) местным жителям (), или globals ()..
Таким образом, мой вопрос является (по крайней мере), двукратным:
1. Что точно делает Вар (), или, в частности, Вар () [x] = y делает,
2. Что область исследования этого словаря (что я должен иметь в виду, поскольку я пишу большие программы
3. Является ли это хорошей практикой программирования.
Заранее спасибо!
http://www.shift8creative.com/projects/agile-uploader/index.html Изменить размер перед отправкой. Гибкая, тесная интеграция JavaScript, давайте использовать любой бэкэнд-язык, быстрый, качественный образ.
Более приятная демонстрация, чем главная страница, на которой показана интеграция JavaScript: http://www.shift8creative.com/projects/agile-uploader/advanced-demo.html
Бесплатно, как в пиве. Надеюсь, это поможет.
-121--4618246-В нашей команде каждую неделю проводятся очередные встречи. Это позволяет узнать, что делают другие и где каждый помещается в общую картину.
Иногда за этим следует мини-социальное мероприятие, когда мы делимся домашним тортом. Имя человека, который приносит торт в следующий раз, написано в протоколе встречи прогресса.
-121--1529903-Пифонический способ создания последовательности переменных
Если требуется последовательность переменных, создайте последовательность. Вместо создания независимых переменных, таких как
variable0
variable1
variable2
variable3
, следует просмотреть создание списка
. Это похоже на то, что предлагает S.Lott (обычно у S.Lott есть хороший совет), но более аккуратно отображается на вашем для
цикла:
sequence = []
for _ in xrange(10):
sequence.append(function_that_returns_data())
(Обратите внимание, что мы отбрасываем переменную цикла ( _
). Мы просто пытаемся получить 10 проходов.)
Тогда ваши данные будут доступны как:
sequence[0]
sequence[1]
sequence[2]
sequence[3]
[...]
sequence[9]
В качестве дополнительного бонуса, вы можете сделать:
for datum in sequence:
process_data(datum)
Сначала вы можете дернуться, когда ваша последовательность начинается с 0. Вы можете пройти через различные изменения, чтобы ваши фактические данные начинались с 1, но это больше боли, чем стоит. Я рекомендую просто привыкнуть к нулевым спискам. Все строится вокруг них, и они начинают чувствовать себя естественным довольно быстро.
vars () и местные жители ()
Теперь, чтобы ответить на другую часть вашего вопроса. vars ()
(или местные жители ()
) обеспечивает низкий уровень доступа к переменным, созданным питоном. Таким образом, следующие две строки эквивалентны.
locals()['x'] = 4
x = 4
Область действия vars () ['x']
в точности совпадает с областью действия x
. Одна из проблем с locals ()
(или vars ()
) заключается в том, что это позволит поместить в пространство имен вещи, которые невозможно вывести из пространства имен обычными средствами. Так что вы можете сделать что-то вроде: locals () [4] = 'Целое число'
, но вы не можете получить это обратно без использования локальных снова, потому что локальное пространство имен (как и для всех пространств имен python) предназначено только для хранения последовательностей.
>>> x = 5
>>> dir()
['__builtins__', '__doc__', '__name__', 'x']
>>> locals()[4] = 'An integer'
>>> dir()
[4, '__builtins__', '__doc__', '__name__', 'x']
>>> x
5
>>> 4
4
>>> locals()[4]
'An integer'
Обратите внимание, что функция 4 не возвращает то же самое, что местные жители () [4]. Это может привести к некоторым неожиданным, трудным для отладки проблемам. Это одна из причин избегать использования locals ()
. Другой заключается в том, что это, как правило, много сложности только для того, чтобы сделать вещи, что Питон обеспечивает более простые, менее ошибки склонны к способам сделать (как создание последовательности переменных).
Я могу ответить на номер 3: это плохая практика программирования. Я не совсем понимаю, чего вы пытаетесь достичь, но уверен, что есть более элегантный способ сделать это без использования locals ()
(что аналогично vars ()
согласно help (vars)
в интерактивной оболочке Python).
Сделайте это вместо этого. Так проще.
myDict = {}
for i in range (1,10):
temp = "variable"+str(i)
myDict[temp] = myFunctionThatReturnsData() # variable1= data1, variable2 = data2,etc.
Это все, что вам нужно делать.
Результатами будут от myDict ['variable1']
до myDict ['variable9']
Вам редко нужны vars ()
или locals ( )
. Просто перестаньте их использовать и используйте обычные переменные и обычные словари. Старайтесь избегать вещей, которых вы не понимаете, и придерживайтесь простых и очевидных вещей.
Из справки для vars,
vars (...) vars ([object]) -> dictionary
Без аргументов, эквивалентно locals (). С аргументом, эквивалентно object .__ dict __.
Вы используете его без переменных, поэтому давайте посмотрим на справку для locals ()
locals (...) locals () -> dictionary
Обновить и вернуть словарь, содержащий локальные
переменные.
Итак, это отвечает на ваши первые два вопроса. vars () возвращает словарь для локальных переменных, который индексируется именем переменной в виде строки. Область применения локальная.
Я не уверен насчет третьего вопроса, но это действительно похоже на взлом, что не является хорошим знаком. Я думаю, если вы будете осторожны с использованием этого только в правильном объеме, вы сможете обойтись этим.