当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python attr.asdict()用法及代码示例


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

用法:attr.asdict (inst, recurse:bool=True, filter:__class__=None, dict_factory:, retain_collection_types:bool=False)

参数:
inst:attrs-decorated类的实例
recurse:(boolean)递归到也是attrs-decorated的类中
dict_factory:可调用以从中产生字典
filter:一个可调用对象,用于确定是包含属性(真)还是删除属性(假)
retain_collection_types:仅当递归为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)))

输出:

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

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

范例2:这是User Info类的另一个示例,该类将接受用户的名称和电子邮件ID作为属性,但不包括dict数据形式的user的电子邮件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类中,我们传递了三个参数name,password和age,其中age是一个整数值,其余值是string。在filter参数中,我们排除了属性-密码和整数值(此处为-age),因此密码和年龄将从字典中排除。

在“坐标”类中,我们传递了三个参数-x,y和z坐标。此处,y坐标作为字符串传递。在filter参数中,我们包括了整数值。因此,x和z坐标包含在最终字典中。如果y坐标已作为整数传递,那么它也将被包括在内。




相关用法


注:本文由纯净天空筛选整理自devanshigupta1304大神的英文原创作品 attr.asdict() function in Python。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。