Python динамическое создание переменной

Python: динамическое создание объектов и кода

Для начала определимся с тем, что подразумевается под динамическим созданием объектов. Одни подразумевают под этим создание объектов программным образом (при помощи кода в визуальных языках программирования), другие — создание нескольких экземпляров объектов одного типа в цикле. Мы же будем понимать под динамическим созданием объектов возможность создания их из текстовой строки. Для чего это нужно? Рассмотрим пару вариантов создания кнопки с использованием PyQt5:

from PyQt5.QtWidgets import QPushButton myButton = QPushButton('Кнопка') myButton.myProp = 100
from PyQt5.QtWidgets import QPushButton myClass = type('My', (QPushButton,), ) btn = myClass("Кнопка")

В обоих примерах кнопке добавлено новое свойство myProp, но добавить его при помощи кода myButton[«myProp»] = 100, как в JavaScript, не выйдет. То есть, строгость и упорядоченность языка Python несколько преувеличена. Каждый новый язык программирования рассматривается либо сквозь стекло своего первого языка программирования, либо сквозь призму уже изученных и любимых технологий. Преимущество Python как раз и состоит в том, что на него можно смотреть сквозь призму, например, и С, и Java, и JavaScript, выбирая для работы с ним тот или иной подход.

Название суперкласса QPushButton, экземпляр которого мы хотим создать, задано жестко его названием. Это повышает надёжность кода, но снижает его гибкость. Если необходимо создать объекты разных классов — кнопок, флажков, текстовых полей и др., то придётся либо создавать отдельные функции для них, либо одну многовариантную функцию. Избежать этого можно использованием универсального конструктора объектов, которому в качестве аргумента передаётся строка с названием класса.

Для доступа к объектам в Python существует метод globals(), возвращающий словарь (ассоциативный список) существующих глобальных объектов. Например, обращение к существующему объекту myVar происходит так:

Это запись чем-то напоминает работу с глобальным объектом window в браузерном JavaScript. Отличие состоит в том, что globals() также возвращает и типы, которые в Python также являются объектами, что позволяет создавать объекты следующим образом:

from PyQt5.QtWidgets import QCheckBox myClass = globals()["QCheckBox"]; checkBox = myClass("Флажок")
import sys from PyQt5.QtWidgets import QCheckBox btn = getattr(sys.modules['__main__'], "QCheckBox")()

Здесь название класса задаётся в виде строки, но необходимость предварительного импорта классов является недостатком указанных примеров, устранить который можно с помощью рефлексии:

mod = __import__('PyQt5.QtWidgets', fromlist=['QCheckBox']) myClass = getattr(mod, 'QCheckBox') chk = myClass('Флажок')

В первой строке происходит подключение библиотеки класса, а метод getattr возвращает класс, объект которого создаётся в поcледней строке.

Читайте также:  Php прочитать все содержимое файла

Рефлексия в Python заметно проще, чем в Java, но нам требуется больше — интерпретация из строки не только объектов, но и кода. Для этого в Python есть методы eval, exec и compile. Метод exec как раз и предназначен для выполнения кода, заданного в строке:

exec(""" mod = __import__('PyQt5.QtWidgets', fromlist=['QCheckBox']) myClass = getattr(mod, 'QCheckBox') chk = myClass('Флажок') """)

Для отображения флажка chk на экране его необходимо добавить какому-нибудь компоновщику, но эта операция вызовет исключение, так как переменная chk имеет локальную область видимости и недоступна за пределами exec. Для доступа к ней необходимо передать дополнительный аргумент, посредством которого она будет доступна глобально:

gl = <> exec(""" mod = __import__('PyQt5.QtWidgets', fromlist=['QCheckBox']) myClass = getattr(mod, 'QCheckBox') chk = klass('myClass') """,gl) gl["chk"].setText("Новый флажок")

Задача генерации кода из строки решена.

Как видно, динамическая работа к объектами и кодом происходит практически так же просто, как в JavaScript и QML. Более того, Python предоставляет разработчику несколько вариантов решения одной и той же задачи, что весьма неплохо.

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

Источник

генерация имен переменных на лету в python

Могу ли я сделать это в цикле или чем-то вместо того, чтобы вручную назначать price1 = prices[0] , price2 = prices[1] и т.д. Спасибо. ИЗМЕНИТЬ Многие люди предложили мне написать причину для этого. Во-первых, были времена, когда я думал, что это может быть более удобно, чем использование списка. Я не помню точно, когда, но я думаю, что я думал об использовании этого, когда есть много уровней гнездования. Например, если у вас есть список списков списков, определение переменных вышеописанным образом может помочь уменьшить уровень вложенности. Во-вторых, сегодня я думал об этом, пытаясь научиться использовать Pytables. Я просто столкнулся с Pytables, и я увидел, что при определении структуры таблицы имена и типы столбцов описываются следующим образом:

class TableFormat(tables.IsDescription): firstColumnName = StringCol(16) secondColumnName = StringCol(16) thirdColumnName = StringCol(16) 

Если у меня есть 100 столбцов, типичное имя каждого столбца кажется очень большим. Итак, я задавался вопросом, есть ли способ генерировать эти имена столбцов на лету.

Читайте также:  Получить имя поля javascript

Это основной запах кода! Какова ваша цель здесь? Что вы собираетесь делать с «price94», когда получите его?

Вариант использования выглядит примерно так: у вас есть код, который принимает некоторые данные и обрабатывает их, а в результате получается, например, некоторое прогнозируемое значение для Y? И вы не знаете, сколько предсказанных значений вам нужно (и t / 4, сколько назначений переменных), потому что это зависит от размера входного массива, который может варьироваться).

Другой вариант использования, метапрограммирование. github.com/apache/incubator-airflow создает такие группы доступности базы данных, github.com/apache/incubator-airflow/blob/master/airflow/… . Если вы хотите создать восходящую или нисходящую зависимость, вы делаете это с помощью имени переменной, которое вы назначаете.

Для будущих путешественников . после дополнительной работы с Airflow я обнаружил, что вы можете создавать эти зависимости точно так же, как и задачи, хранящиеся в диктантах или списках. На самом деле вам даже не нужно их хранить, так как вызов оператора мутирует DAG.

Источник

Создание переменных с переменными именами в Python

Существуют ситуации, когда может возникнуть необходимость создания переменных с динамическими именами, то есть именами, которые определяются в процессе выполнения программы. Например, при обработке больших данных, когда количество и имена переменных заранее неизвестны.

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

Однако, если все же возникла необходимость использования такого подхода, в Python есть несколько способов реализации этой идеи.

Способ 1. Использование словарей

В Python словарь — это структура данных, которая позволяет хранить пары «ключ-значение». Использование словаря позволяет создавать и обращаться к переменным по их «ключам», которые могут быть динамическими.

variables = <> variables["var1"] = 1 variables["var2"] = 2

Способ 2. Использование функции globals()

Функция globals() возвращает словарь, который содержит все глобальные переменные. Таким образом, можно добавить в этот словарь новую переменную с динамическим именем.

Однако, следует быть осторожным с этим методом, так как он может привести к неожиданным последствиям, если имя новой переменной совпадет с именем уже существующей глобальной переменной или зарезервированным словом.

Читайте также:  Python sqlalchemy raw query

Вывод

Создание переменных с переменными именами в Python возможно, но следует использовать этот подход с осторожностью. Чаще всего, решение, которое не требует создания таких переменных, будет более безопасным и понятным.

Источник

PYTHON ДИНАМИЧЕСКОЕ СОЗДАНИЕ ПЕРЕМЕННЫХ

Python является динамическим языком программирования, что позволяет во время выполнения программы создавать переменные динамически. Для создания переменной в Python необходимо указать ее имя, знак присваивания и значение. Например:

x = 5
y = «Hello, World!»
z = [1, 2, 3]

В данном примере созданы три переменные: x, y и z. Переменная x содержит число 5, переменная y содержит строку «Hello, World!» и переменная z содержит список [1, 2, 3]. Важно отметить, что в Python не нужно определять тип переменной заранее, он определяется автоматически во время выполнения программы.

Для динамического создания переменных в Python используется функция globals(), которая возвращает словарь с глобальными переменными. Для создания новой переменной необходимо добавить элемент в словарь, присвоив ему имя и значение. Например:

globals()[‘a’] = 10
globals()[‘b’] = «Hello, World!»
print(a, b)

В данном примере созданы две переменные a и b, им присвоены значения 10 и «Hello, World!» соответственно. Функция print() выводит значения переменных на экран.

Python также позволяет использовать оператор exec() для динамического создания переменных. Оператор exec() позволяет выполнять код на Python из строки. Для создания переменной необходимо указать ее имя и значение в виде строки, которую затем нужно передать в функцию exec(). Например:

name = «John»
age = 30
code = «country = ‘USA'»
exec(code)
print(name, age, country)

В данном примере созданы переменные name и age, а также создана строка «country = ‘USA'». Затем эта строка передана в функцию exec(), которая создала новую переменную country со значением «USA». Функция print() выводит значения всех трех переменных на экран.

Python-3. Как создать переменную в Python

Python для начинающих. Как работают переменные в Python. #2

#6. Реализация динамического массива на Python — Структуры данных

6.1 Создание переменных и введение в понятие Тип данных. Основы Python

КАК РАБОТАЕТ ПАМЯТЬ В ПИТОНЕ? ССЫЛКИ И ПЕРЕМЕННЫЕ

Урок 4 Переменные в Python. Оператор присваивания

Павел Калинин. Хорошие навыки, но не сошлись в зарплате. Собеседование junior python разработчик

Python l Обмен значений двух переменных. Без третьей переменной

Уроки Python — №4 Переменные

Я ВСЕХ ОБМАНУЛ. Извиняшки! Вся ПРАВДА о переменных в Python

Источник

Оцените статью