我有一个像这样的 Pydantic 模型类
class User(BaseModel):
username: str
firstname: str
lastname: str
现在,我希望能够在没有硬编码的情况下引用“用户名”(就像我如何能够引用类名一样)
setup_index(User.__name__, "username")
有没有办法不经过代码生成路线?
getattr(user, 'username')
可以使用(如@michael-butscher 所述)。name_getter = operator.attrgetter('username')
并将其提供给客户端以用作name_getter(user)
. 可以通过在中定义一个getter方法User
并提供该方法的引用来达到相同的效果。无论哪种方式,如果username
是实现细节,那么这种方法有助于向客户端隐藏这些细节。您可以使用getattr
和setattr
函数直接访问类中的属性
user = User('Vegeta') #initializing a class instance with username 'Vegeta'
new_username = getattr(user, 'username') #getting the attribute and assigning it
setup_index(User.__name__, new_username)
我知道这个问题已经过时了,但您也可以执行以下任一操作(性能牺牲可以忽略不计):
user = User(username="JohnAppleseed", firstname="John", lastname="Appleseed")
# method one, pydantic not used
username = user.__dict__.get('username')
# method two, no encoders called
username = user.dict().get('username')
# method three, encoders called
import json
username = json.loads(user.json()).get('username')
这避免了调用 to getattr
,在我看来这不是很优雅