如何将 Python 类的*实例*标记为已弃用? [重复]

问题描述 投票:0回答:1

我继承了一些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
来破解它,并在那里引发弃用警告,但是有更干净的方法吗?

python instance deprecated deprecation-warning
1个回答
4
投票

类级属性(组合

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
 
© www.soinside.com 2019 - 2024. All rights reserved.