我可以看到实现这项工作的多个障碍,这很可能是不可能的,但我想我至少会问......
因此,毫不奇怪,我有一个类AbstractEnumeratedConstantsGroup
,当子类化创建一个表示一组枚举常量的对象(例如,返回FLAVORS
值('VANILLA', 'CHOCOLATE', 'STRAWBERRY')
、FLAVORS[0]
返回值'VANILLA'
、FLAVORS[1]
返回值'CHOCOLATE'
、FLAVORS.VANILLA
返回值等)时0
,它使用元类和其他一些步法,以便所有这些都是创建新常量组所需的是:FLAVORS.CHOCOLATE
1
class FLAVORS(AbstractEnumeratedConstantsGroup):
_constants = ('VANILLA', 'CHOCOLATE', 'STRAWBERRY')
FLAVORS = FLAVORS()
我想进一步减少它:
@enumerated_constants_group
FLAVORS = ('VANILLA', 'CHOCOLATE', 'STRAWBERRY')
我不知道如何解决的问题是:
-
1. 没有很好的方法从装饰器代码的定义范围中获取对象的标签名称 2. 不能装饰不是类、方法或函数的东西
我考虑过使用工厂/构建器,但我不喜欢的是它需要在代码中重复组名,或者组具有无用的__name__
值(用于__repr__
和__str__
)。前任:
FLAVOR = enumerated_constants_group('FLAVOR', ('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))
或者
FLAVOR = enumerated_constants_group(('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))
# FLAVOR.__name__ becomes some unfriendly machine-generated string
作为装饰器思想的替代方案,是否可以从工厂方法引用调用范围(通过自省或隐式传递给函数),以便调用该方法会将新创建的对象插入到调用命名空间中给定的名字?前任:
enumerated_constants_group('FLAVOR', ('VANILLA', 'CHOCOLATE', 'STRAWBERRY'))
# I could now reference FLAVOR in any arbitrary scope that the method was called from
我能做些什么来实现我想要的吗?还有其他我没有想到的方法吗?