我继承了一些API代码的维护。我需要更新的事情之一是一些环境信息(想想登台、生产)。旧名称为
test
和 production
,新名称为 sandbox
、simulator
和 production
。旧名称 test
与今天的 simulator
具有相同的语义。
这是如何实现的,是使用一个类,并为每个环境预定义实例,例如:
class Environment(object):
def __init__(self, name, params):
self.name = name
self.params = params
test = Environment('test', ... params ...)
production = Environment('production', ... params ...)
我可以轻松定义新名称,并且为了不破坏现有代码,请这样做
test = simulator
但我想要使用旧实例的代码
Test
引发Python弃用警告。
我该怎么做?我可以通过在类代码中插入
if
来破解它,并在那里引发弃用警告,但是有更干净的方法吗?
类级属性(组合
property
和 classmethod
)可以使用,但这些已被弃用。
相反,您需要提供一个自定义元类,以便可以将类属性
Test
转换为在元类上定义的属性。然后,属性 getter 可以在返回替换值之前引发弃用警告。
import warnings
class Foo(type):
@property
def Test(self):
warnings.warn('"Test" is deprecated, use "Simulator" instead', DeprecationWarning)
return self.Simulator
class Environment(metaclass=Foo):
def __init__(self, name, params):
self.name = name
self.params = params
Environment.Simulator = Environment('test', [])
Environment.Production = Environment('production', [])
print(Environment.Test.name)
输出
/Users/chepner/tmp.py:7: DeprecationWarning: "Test" is deprecated, use "Simulator" instead
warnings.warn('"Test" is deprecated, use "Simulator" instead', DeprecationWarning)
test