2017-03-08 54 views
2

我正在使用令人驚歎的attrs庫以非常優雅的方式定義大量對象屬性,並且它迄今一直像魅力一樣工作。Python attrs庫:使用其他屬性定義attr.ib(默認=)

我目前遇到的唯一問題是我有時想通過引用其他attr.ib()屬性來定義默認值。下面是一些代碼如果name默認的是一個靜態的字符串,可以運行:

import attr 
from attr.validators import instance_of 
import datetime 

@attr.s 
class Something: 
    some_date = attr.ib(validator=instance_of(datetime.date)) 
    some_number = attr.ib(convert=float) 
    name = attr.ib(validator=instance_of(str), 
        default="Generic Name {0} - {1}%".format(
         some_date.strftime("%d-%b-%Y"), 
         some_number * 100) 
        ) 

something_instance = Something(some_date=datetime.date.today(), some_number=0.375) 

的問題是,name沒有看到一個floatdate,但_CountingAttr對象,所以我得到一個AttributeError(和some_number * 100TypeError)。既然我不能參考self,我該怎麼做?

回答

2

所以這似乎不可能與當前的默認關鍵字。不過,要達到同樣的效果,它可以使用__attrs_post_init__方法,它可以用來執行實例初始化後任意算了一筆賬:http://attrs.readthedocs.io/en/stable/examples.html?highlight=attrs_post_init#other-goodies

在我的例子,將基本回落到加

def __attrs_post_init__(self): 
    if self.name is None: 
     self.name = "Generic Name {0} - {1}%".format(
      self.some_date.strftime("%d-%b-%Y"), 
      self.some_number * 100) 

信用去attrs github問題跟蹤器指向我在正確的方向。