在 Python 中解构字典和对象

新手上路,请多包涵

在 Javascript 中,我可以使用 解构 从一个 javascript 对象中提取我想要的属性。例如:

 currentUser = {
  "id": 24,
  "name": "John Doe",
  "website": "http://mywebsite.com",
  "description": "I am an actor",
  "email": "example@example.com",
  "gender": "M",
  "phone_number": "+12345678",
  "username": "johndoe",
  "birth_date": "1991-02-23",
  "followers": 46263,
  "following": 345,
  "like": 204,
  "comments": 9
}

let { id, username } = this.currentUser;
console.log(id) // 24
console.log(username) //johndoe

对于 Python 字典和 Python 对象,我们在 Python 中有类似的东西吗? Python 对象的 Python 处理方式示例:

 class User:
    def __init__(self, id, name, website, description, email, gender, phone_number, username):
        self.id = id
        self.name = name
        self.website = website
        self.description = description
        self.email = email
        self.gender = gender
        self.phone_number = phone_number
        self.username = username

current_user = User(24, "Jon Doe", "http://mywebsite.com", "I am an actor", "example@example.com", "M", "+12345678", "johndoe")

# This is a pain
id = current_user.id
email = current_user.email
gender = current_user.gender
username = current_user.username

print(id, email, gender, username)

编写这 4 行(如上面的示例所述)与编写一行(如下所述)以从对象中获取我需要的值是一个真正的痛点。

 (id, email, gender, username) = current_user

原文由 ThinkGeek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 523
2 个回答

您可以使用标准库中的 operator 模块,如下所示:

 from operator import attrgetter
id, email, gender, username = attrgetter('id', 'email', 'gender', 'username')(current_user)
print(id, email, gender, username)

如果你的例子中有一个字典

currentUser = {
  "id": 24,
  "name": "John Doe",
  "website": "http://mywebsite.com",
  "description": "I am an actor",
  "email": "example@example.com",
  "gender": "M",
  "phone_number": "+12345678",
  "username": "johndoe",
  "birth_date": "1991-02-23",
  "followers": 46263,
  "following": 345,
  "like": 204,
  "comments": 9
}

只需使用 itemgetter 而不是 attrgetter

 from operator import itemgetter
id, email, gender, username = itemgetter('id', 'email', 'gender', 'username')(currentUser)
print(id, email, gender, username)

原文由 Lev Romanov 发布,翻译遵循 CC BY-SA 4.0 许可协议

基于其他答案,我建议还使用 Python 的 dataclasses 并使用 __getitem__ 获取特定字段:

 from dataclasses import astuple, dataclass

@dataclass
class User:
    id: int
    name: str
    website: str
    description: str
    email: str
    gender: str
    phone_number: str
    username: str

    def __iter__(self):
        return iter(astuple(self))

    def __getitem__(self, keys):
        return iter(getattr(self, k) for k in keys)


current_user = User(id=24, name="Jon Doe", website="http://mywebsite.com", description="I am an actor", email="example@example.com", gender="M", phone_number="+12345678", username="johndoe")

# Access fields sequentially:
id, _, email, *_ = current_user
# Access fields out of order:
id, email, gender, username = current_user["id", "email", "gender", "username"]

原文由 Carl G 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题