📜  Python中的 attr.asdict()函数

📅  最后修改于: 2022-05-13 01:54:33.531000             🧑  作者: Mango

Python中的 attr.asdict()函数

Python有一个名为attrs的库,它使以面向对象模式编写的代码更加简单和简洁。在有数据的类中,最好将其转换为字典。我们可以在Python中使用 attr.asdict()函数将 i 的attrs属性值作为 dict 返回。

示例 1:让我们举一个非常简单的类坐标示例,它接受坐标作为属性。

Python3
# import library
import attr
  
  
# initialising class Coordinates, no need to
# initialize __init__ method
@attr.s
class Coordinates(object):
    
    # attributes
    x = attr.ib()
    y = attr.ib()
  
  
c1 = Coordinates(1, 2)
  
# converting data into dict using attr.asdict() 
# function
print(attr.asdict(Coordinates(x=1, y=2)))


Python3
import attr
  
  
@attr.s
class UserInfo(object):
    users = attr.ib()
  
  
@attr.s
class User(object):
    email = attr.ib()
    name = attr.ib()
  
  
# including only name and not email
attr.asdict(UserInfo([User("lee@har.invalid", "Lee"),
                      User("rachel@har.invalid", "Rachel")]),
            filter=lambda attr, value: attr.name != "email")


Python3
import attr
  
  
@attr.s
class UserInfo(object):
    name = attr.ib()
    password = attr.ib()
    age = attr.ib()
  
  
# excluding attributes
print(attr.asdict(UserInfo("Marco", "abc@123", 22),
                  filter=attr.filters.exclude(
                      attr.fields(UserInfo).password, int)))
  
  
@attr.s
class Coordinates(object):
    x = attr.ib()
    y = attr.ib()
    z = attr.ib()
  
  
# inclusing attributes
print(attr.asdict(Coordinates(20, "5", 3),
                  filter=attr.filters.include(int)))


输出:

{'x': 1, 'y': 2}

在这里,传递的数据被转换成字典形式。

示例 2:这是另一个 User Info 类的示例,它将接受用户的姓名和电子邮件 ID 作为属性,但不会以 dict 数据形式包含用户的电子邮件 ID。

Python3

import attr
  
  
@attr.s
class UserInfo(object):
    users = attr.ib()
  
  
@attr.s
class User(object):
    email = attr.ib()
    name = attr.ib()
  
  
# including only name and not email
attr.asdict(UserInfo([User("lee@har.invalid", "Lee"),
                      User("rachel@har.invalid", "Rachel")]),
            filter=lambda attr, value: attr.name != "email")

输出:

{'users': [{'name': 'Lee'}, {'name': 'Rachel'}]}

在这里,我们将得到一个嵌套字典,其中排除了用户的电子邮件。

示例 3:我们可以使用 attr.asdict()函数的参数过滤器尝试不同的方法来包含或排除属性。

Python3

import attr
  
  
@attr.s
class UserInfo(object):
    name = attr.ib()
    password = attr.ib()
    age = attr.ib()
  
  
# excluding attributes
print(attr.asdict(UserInfo("Marco", "abc@123", 22),
                  filter=attr.filters.exclude(
                      attr.fields(UserInfo).password, int)))
  
  
@attr.s
class Coordinates(object):
    x = attr.ib()
    y = attr.ib()
    z = attr.ib()
  
  
# inclusing attributes
print(attr.asdict(Coordinates(20, "5", 3),
                  filter=attr.filters.include(int)))

输出:

{'name': 'Marco'}
{'x': 20, 'z': 3}

在这里,在UserInfo类中,我们传递了三个参数名称、密码和年龄,其中年龄是一个整数值,其余值是字符串。在过滤器参数中,我们排除了属性——密码和整数值(此处为 -age),因此密码和年龄将从字典中排除。

在类Coordinates中,我们传递了三个参数 - x、y 和 z 坐标。这里 y 坐标作为字符串传递。在过滤器参数中,我们包含了整数值。因此,x 和 z 坐标包含在最终字典中。如果 y 坐标作为整数传递,那么它也会被包含在内。