Найти - Пользователи
Полная версия: Имя переменной экземпляра класса из строки
Начало » Центр помощи » Имя переменной экземпляра класса из строки
1 2
dpostnov
Есть несколько классов в модуле SQL:
 class DicLevel(Base):
	__tablename__ = 'DicLevel'
	DicLevel_ID = Column(Integer, primary_key=True)
	DicLevel_Name = Column(String(255))
	)
	
class DicLocation(Base):
	__tablename__ = 'DicLocation'
	DicLocation_ID = Column(Integer, primary_key=True)
	DicLocation_Name = Column(String(255))
	)
Есть переменная в которой может содержатся имя класса, например:
 DictName = "DicLocation"
При объявлении экземпляра класса использую переменную:
 from . import models as SQL
DictAdd = eval('SQL.'+DictName)(DicLocation_Name="2")
Вывод данной переменной также делаю через переменную
 print(eval('DictAdd.'+DictName+'_Name'))
А как при объявлении экземпляра класса имя переменной класса брать тоже из строковой переменной DictName? Т.е. конструкция
 DictAdd = eval('SQL.'+DictName)(eval(DictName+'_Name')="2")
не работает
AD0DE412
эээто странная конструкция добавте немного контекста зачем все это
Rodegast
Никаких evel или exec быть не должно! Эти конструкции не безопасные.
Сделай словарь с классами и доставай из от туда.
 TABLE = {
    SQL.DicLevel,
    SQL.DicLocation
}
dictAdd = TABLE[DictName]
Ну и называй поля таблиц как то более осмысленно.
PEHDOM
dpostnov в евале не может быть присваивания. для присваивания exec
 class DicLocation():
	__tablename__ = 'DicLocation'
	DicLocation_ID = 1
	DicLocation_Name = 1
DictName = "DicLocation"
DictAdd = eval('{}()'.format(DictName))
print(DictAdd.DicLocation_Name)
exec('DictAdd.{}_Name = 2'.format(DictName))
print(DictAdd.DicLocation_Name)
>>>
1
2
>>>


Rodegast
Эти конструкции не безопасные.
это далеко не так, небезопасно скармливать им чтото что может прийти снаружи/ не из доверенного источника. А не вообще им пользваться.
Rodegast
> небезопасно скармливать им чтото что может прийти снаружи/ не из доверенного источника.

Про SQL-инъекции слышал? Ты сможешь гарантировать что все используемые в этих конструкциях переменные приходят из “доверенных источников” и что они никогда не поменяют своей симантики? Если не сможешь, то использовать их нельзя. А лучше вообще ими не пользоваться, тем более что профита от них никакого нет.
dpostnov
Вопрос собственно не в eval, можно и через словарь. Вопрос как передать, во время создания экземпляра класса, значение свойства класса в зависимости от переменной:
model.py:
 from sqlalchemy import Column, Integer, String, ForeignKey, PrimaryKeyConstraint, UniqueConstraint, ForeignKeyConstraint
from sqlalchemy.orm import column_property, relationship, deferred
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class DicLevel(Base):
	__tablename__ = 'DicLevel'
	DicLevel_ID = Column(Integer, primary_key=True)
	DicLevel_Name = Column(String(255))
class DicLocation(Base):
	__tablename__ = 'DicLocation'
	DicLocation_ID = Column(Integer, primary_key=True)
	DicLocation_Name = Column(String(255))

test.py
 import model as SQL
Tables = {
	'DicLevel' : SQL.DicLevel,
	'DicLocation' : SQL.DicLocation,
	}
def dic_add():
	DictName = "DicLevel"
	DictAdd = Tables[DictName](DicLevel_Name = '22swdasdas')
	print(DictAdd.DicLevel_Name)
dic_add()
Это прекрасно работает без eval, но при создании экземпляра объекта указывается переменная класса напрямую которой присваевается значение DicLevel_Name = ‘22swdasdas’.
Смысл вопроса, как команду:
 DictAdd = Tables[DictName](DicLevel_Name = '22swdasdas')

преобразовать к виду:
 DictAdd = Tables[DictName]("""Чегото там в зависимости от переменной DictName""" = '22swdasdas')
dpostnov
Rodegast
Ну и называй поля таблиц как то более осмысленно.
В смысле? Что значит осмыслено? Что непонятно в поле Dic Locationa Name?
Rodegast
> как команду: … преобразовать к виду: …

 DictAdd = Tables[DictName](**{DicLevel_Name: '22swdasdas'})

> Что непонятно в поле Dic Locationa Name?

Не понятно зачем нужен префикс с именем таблицы у всех полей. Если бы его не было, то и такой проблемы не возникло бы.
xam1816
dpostnov
Вопрос как передать, во время создания экземпляра класса, значение свойства класса в зависимости от переменной:
может так сделать
 class DicLevel(Base):
	__tablename__ = 'DicLevel'
	DicLevel_ID = Column(Integer, primary_key=True)
	DicLevel_Name = Column(String(255))
	def __init__(self,DicLevel_Name):
		self.DicLevel_Name = DicLevel_Name
table = DicLevel('чего-то там')
AD0DE412
ну так сетер гетер классика же
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB