2

我有一个像这样的 Pydantic 模型类

class User(BaseModel):
   username: str
   firstname: str
   lastname: str

现在,我希望能够在没有硬编码的情况下引用“用户名”(就像我如何能够引用类名一样)

setup_index(User.__name__, "username") 

有没有办法不经过代码生成路线?

4

3 回答 3

3
  1. 如果客户端知道成员的名称,则getattr(user, 'username')可以使用(如@michael-butscher 所述)。
  2. 如果客户端不知道成员的名称,则可以通过创建 getter 函数name_getter = operator.attrgetter('username')并将其提供给客户端以用作name_getter(user). 可以通过在中定义一个getter方法User并提供该方法的引用来达到相同的效果。无论哪种方式,如果username是实现细节,那么这种方法有助于向客户端隐藏这些细节。
于 2020-01-13T19:25:41.240 回答
3

您可以使用getattrsetattr函数直接访问类中的属性

 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) 
于 2020-01-13T22:58:23.407 回答
0

我知道这个问题已经过时了,但您也可以执行以下任一操作(性能牺牲可以忽略不计):

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,在我看来这不是很优雅

于 2021-11-03T14:09:23.257 回答