Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 13, 2021 09:11:48

dpostnov
Зарегистрирован: 2021-08-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

Есть несколько классов в модуле 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")
не работает

Отредактировано dpostnov (Авг. 13, 2021 09:22:22)

Офлайн

#2 Авг. 13, 2021 12:00:39

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

эээто странная конструкция добавте немного контекста зачем все это



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#3 Авг. 13, 2021 14:56:17

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2763
Репутация: +  185  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

Никаких evel или exec быть не должно! Эти конструкции не безопасные.
Сделай словарь с классами и доставай из от туда.

 TABLE = {
    SQL.DicLevel,
    SQL.DicLocation
}
dictAdd = TABLE[DictName]
Ну и называй поля таблиц как то более осмысленно.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#4 Авг. 13, 2021 16:21:57

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Авг. 13, 2021 16:31:44)

Офлайн

#5 Авг. 13, 2021 18:01:02

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2763
Репутация: +  185  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

> небезопасно скармливать им чтото что может прийти снаружи/ не из доверенного источника.

Про SQL-инъекции слышал? Ты сможешь гарантировать что все используемые в этих конструкциях переменные приходят из “доверенных источников” и что они никогда не поменяют своей симантики? Если не сможешь, то использовать их нельзя. А лучше вообще ими не пользоваться, тем более что профита от них никакого нет.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#6 Авг. 13, 2021 19:44:12

dpostnov
Зарегистрирован: 2021-08-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

Вопрос собственно не в 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')

Офлайн

#7 Авг. 13, 2021 19:51:58

dpostnov
Зарегистрирован: 2021-08-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

Rodegast
Ну и называй поля таблиц как то более осмысленно.
В смысле? Что значит осмыслено? Что непонятно в поле Dic Locationa Name?

Офлайн

#8 Авг. 13, 2021 20:11:58

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2763
Репутация: +  185  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

> как команду: … преобразовать к виду: …

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

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

Не понятно зачем нужен префикс с именем таблицы у всех полей. Если бы его не было, то и такой проблемы не возникло бы.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Авг. 13, 2021 20:17:27)

Онлайн

#9 Авг. 13, 2021 21:32:14

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1372
Репутация: +  122  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

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('чего-то там')

Офлайн

#10 Авг. 13, 2021 22:41:10

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Имя переменной экземпляра класса из строки

ну так сетер гетер классика же



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version