Форум сайта python.su
Есть несколько классов в модуле 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'))
DictAdd = eval('SQL.'+DictName)(eval(DictName+'_Name')="2")
Отредактировано dpostnov (Авг. 13, 2021 09:22:22)
Офлайн
эээто странная конструкция добавте немного контекста зачем все это
Офлайн
Никаких evel или exec быть не должно! Эти конструкции не безопасные.
Сделай словарь с классами и доставай из от туда.
TABLE = { SQL.DicLevel, SQL.DicLocation } dictAdd = TABLE[DictName]
Онлайн
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)
Офлайн
> небезопасно скармливать им чтото что может прийти снаружи/ не из доверенного источника.
Про SQL-инъекции слышал? Ты сможешь гарантировать что все используемые в этих конструкциях переменные приходят из “доверенных источников” и что они никогда не поменяют своей симантики? Если не сможешь, то использовать их нельзя. А лучше вообще ими не пользоваться, тем более что профита от них никакого нет.
Онлайн
Вопрос собственно не в 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))
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()
DictAdd = Tables[DictName](DicLevel_Name = '22swdasdas')
DictAdd = Tables[DictName]("""Чегото там в зависимости от переменной DictName""" = '22swdasdas')
Офлайн
RodegastВ смысле? Что значит осмыслено? Что непонятно в поле Dic Locationa Name?
Ну и называй поля таблиц как то более осмысленно.
Офлайн
> как команду: … преобразовать к виду: …
DictAdd = Tables[DictName](**{DicLevel_Name: '22swdasdas'})
Отредактировано Rodegast (Авг. 13, 2021 20:17:27)
Онлайн
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('чего-то там')
Офлайн
ну так сетер гетер классика же
Офлайн