Я думаю, что это не лучший способ достичь этого, поскольку он создает зависимость вашего конструктора от глобальной переменной session
, а также неожиданно изменяет поведение конструктора (ожидается, что new
возвращает new в конце концов). Если, например, кто-то использует ваши классы с двумя сеансами параллельно, код будет терпеть неудачу, и ему придется выкопать код, чтобы найти ошибку.
Я не знаю никакой «sqlalchemy», способ достижения этого, но я бы предложил создать функцию createOrGetAccountModel
, подобную
def createOrGetAccountModel(**kw):
if len(kw) and "name" in kw:
x = session.query(AccountModel).filter_by(name=kw["name"]).first()
if x: return x
return AccountModel(**kw)
В духе «явное лучше, чем неявное»:
data = [('John', '123'), ('Alex', '456'), ('Nate', '789')]
names = [x[0] for x in data]
ids = [x[1] for x in data]
print(names) # prints ['John', 'Alex', 'Nate']
print(ids) # prints ['123', '456', '789']
Или даже, чтобы быть еще более явным:
data = [('John', '123'), ('Alex', '456'), ('Nate', '789')]
NAME_INDEX = 0
ID_INDEX = 1
names = [x[NAME_INDEX] for x in data]
ids = [x[ID_INDEX] for x in data]
это компактный способ сделать это, используя zip
:
lst = [('John', '123'), ('Alex','456'),('Nate', '789')]
name, userid = list(zip(*lst))
print(name) # ('John', 'Alex', 'Nate')
print(userid) # ('123', '456', '789')
заметить, что результаты сохраняются в (неизменяемом) tuple
с; если вам нужно (мутирует) list
, вам нужно разыграть.