簡體   English   中英

Python attrs 庫:使用其他屬性定義 attr.ib(default=)

[英]Python attrs library: define attr.ib(default=) using other attributes

我正在使用令人驚嘆的attrs庫以非常優雅的方式定義許多對象屬性,到目前為止它一直在工作。

我目前遇到的唯一問題是我有時想通過引用其他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 ,我該怎么做?

因此,目前使用 default 關鍵字似乎無法做到這一點。 但是,要達到同樣的效果,可以使用__attrs_post_init__方法,該方法可以在實例初始化后執行任意計算: http : __attrs_post_init__ -好東西

在我的例子中,它基本上歸結為添加

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 問題跟蹤器為我指明了正確的方向。

您也可以在沒有__attrs_post_init__情況下執行此__attrs_post_init__

只需使用default = attr.Factory(lambda self: ..., takes_self=True)

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=attr.Factory(lambda self: "Generic Name {0} - {1}%".format(
                       self.some_date.strftime("%d-%b-%Y"),
                       self.some_number * 100)
                   ), takes_self=True)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM