Python: Используя Вар () для присвоения строки переменной

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

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. Является ли это хорошей практикой программирования.

Заранее спасибо!

24
задан PPTim 23 February 2010 в 19:09
поделиться

4 ответа

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 () . Другой заключается в том, что это, как правило, много сложности только для того, чтобы сделать вещи, что Питон обеспечивает более простые, менее ошибки склонны к способам сделать (как создание последовательности переменных).

35
ответ дан 28 November 2019 в 22:47
поделиться

Я могу ответить на номер 3: это плохая практика программирования. Я не совсем понимаю, чего вы пытаетесь достичь, но уверен, что есть более элегантный способ сделать это без использования locals () (что аналогично vars () согласно help (vars) в интерактивной оболочке Python).

3
ответ дан 28 November 2019 в 22:47
поделиться

Сделайте это вместо этого. Так проще.

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 ( ) . Просто перестаньте их использовать и используйте обычные переменные и обычные словари. Старайтесь избегать вещей, которых вы не понимаете, и придерживайтесь простых и очевидных вещей.

9
ответ дан 28 November 2019 в 22:47
поделиться

Из справки для vars,

vars (...) vars ([object]) -> dictionary

 Без аргументов, эквивалентно locals (). 
С аргументом, эквивалентно object .__ dict __. 
 

Вы используете его без переменных, поэтому давайте посмотрим на справку для locals ()

locals (...) locals () -> dictionary

 Обновить и вернуть словарь, содержащий локальные 
 

переменные.

Итак, это отвечает на ваши первые два вопроса. vars () возвращает словарь для локальных переменных, который индексируется именем переменной в виде строки. Область применения локальная.

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

6
ответ дан 28 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

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