gpt4 book ai didi

python - 从 **kwargs 构造期间设置类的属性

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:47 24 4
gpt4 key购买 nike

这里是 Python 新手,

目前我正在使用 SQLAlchemy,我有这个:

from __init__ import Base
from sqlalchemy.schema import Column, ForeignKey
from sqlalchemy.types import Integer, String
from sqlalchemy.orm import relationship

class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
username = Column(String, unique=True)
email = Column(String)
password = Column(String)
salt = Column(String)
openids = relationship("OpenID", backref="users")

User.__table__.create(checkfirst=True)

#snip definition of OpenID class

def create(**kwargs):
user = User()
if "username" in kwargs.keys():
user.username = kwargs['username']
if "email" in kwargs.keys():
user.username = kwargs['email']
if "password" in kwargs.keys():
user.password = kwargs['password']

return user

这在 /db/users.py 中,因此可以像这样使用:

from db import users
new_user = users.create(username="Carson", password="1234")
new_user.email = "email@address.com"
users.add(new_user) #this function obviously not defined yet

但是 create() 中的代码有点笨,我想知道是否有更好的方法来做到这一点,不需要 if 阶梯,如果有的话会失败添加了不在用户对象中的键。喜欢:

for attribute in kwargs.keys():
if attribute in User:
setattr(user, attribute, kwargs[attribute])
else:
raise Exception("blah")

这样我就可以把它放在它自己的函数中(除非一个希望已经存在?)所以我不必一次又一次地做 if 阶梯,这样我就可以在不修改这段代码的情况下改变表结构。

有什么建议吗?

最佳答案

我的建议是不要进一步简化它。如果您分配任意属性,您就有踩到重要对象结构的风险。

我要做的一个简化是当你在 dict 上使用它时删除 .keys() ;包含检查和迭代都已使用 key 。

...

再三考虑,您可以拥有一个包含已知安全属性的类属性,然后在函数中检查该属性,并在实例上使用 setattr()

关于python - 从 **kwargs 构造期间设置类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com