Python中的 attr.asdict()函数
Python有一个名为attrs的库,它使以面向对象模式编写的代码更加简单和简洁。在有数据的类中,最好将其转换为字典。我们可以在Python中使用 attr.asdict()函数将 i 的attrs属性值作为 dict 返回。
Syntax: attr.asdict (inst, recurse: bool=True, filter: __class__=None, dict_factory: , retain_collection_types: bool=False)
Parameters:
inst : instance of an attrs-decorated class
recurse : (boolean) recurse into classes that are also attrs-decorated
dict_factory : a callable to produce dictionaries from
filter : a callable that determines whether an attribute is included (True) or dropped (False)
retain_collection_types : only meaningful if recurse is True.
示例 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 坐标作为整数传递,那么它也会被包含在内。