gpt4 book ai didi

python - 如何在对象创建过程中设置字段值?

转载 作者:行者123 更新时间:2023-11-30 22:06:49 26 4
gpt4 key购买 nike

我想将id初始化为phrasetype的串联

from enum import Enum
from typing import NamedTuple

class WORD_TYPE(str, Enum):
APPROVED = 'approved'
FORBIDDEN = 'forbidden'
RISKY = 'risky'

class WordItem(NamedTuple):
phrase: str
type: WORD_TYPE

id: str = f'{phrase}_{type.name.lower()}'

因此,每次当我指定phrasetype时,我都希望自动获得一个id

word_item = WordItem(phrase='phrase', type=WORD_TYPE.FORBIDDEN)
asssert word_item.id == 'phrase_forbidden'

最好的方法是什么?也许有某种方法可以使用 https://github.com/ericvsmith/dataclasses 来做到这一点?

最佳答案

这就是特殊方法 __new__ 应该解决的问题。不幸的是,NamedTuple 阻止其在其定义内进行覆盖。

但是您可以使用装饰器在定义之外覆盖它:

def set_default(attr, func):
def set_new(typ):
old = typ.__new__
sig = inspect.signature(old)
def _new(cls, *args, **kwargs):
bound = sig.bind_partial(cls, *args, **kwargs).arguments
if not attr in bound:
bound[attr] = func(*args, **kwargs)
# print(bound) # uncomment for debug traces
return old(**bound)
typ.__new__ = _new
return typ
return set_new

@set_default('id', lambda phrase, typ: f'{phrase}_{typ.name.lower()}')
class WordItem(NamedTuple):
phrase: str
type: WORD_TYPE
id: str = None

然后您可以使用 WordItem:

>>> w = WordItem('a', WORD_TYPE.APPROVED)
>>> w
WordItem(phrase='a', type=<WORD_TYPE.APPROVED: 'approved'>, id='a_approved')
>>> w2 = WordItem('b', WORD_TYPE.APPROVED, 'c')
>>> w2
WordItem(phrase='b', type=<WORD_TYPE.APPROVED: 'approved'>, id='c')

但是:

  • NamedTuple 出于某种原因阻止覆盖 __new__
  • 这试图实现明确禁止的功能

如果可以的话,你应该避免这个技巧。它在我的 3.6 版本中工作正常,但它可能会在 NamedTuple 的 future 版本中崩溃,或者被 native 实现取代......

关于python - 如何在对象创建过程中设置字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52626031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com