如何在Python中创建两个装饰器来执行以下操作?
@makebold
@makeitalic
def say():
return "Hello"
Run Code Online (Sandbox Code Playgroud)
...应该返回:
"<b><i>Hello</i></b>"
Run Code Online (Sandbox Code Playgroud)
我不是试图HTML在一个真实的应用程序中这样做 - 只是试图了解装饰器和装饰器链是如何工作的.
我重命名了一个python类,它是库的一部分.我愿意在一段时间内使用其以前的名称,但是我想警告用户它已被弃用,将来会被删除.
我认为,为了提供向后兼容性,使用类似的别名就足够了:
class NewClsName:
pass
OldClsName = NewClsName
Run Code Online (Sandbox Code Playgroud)
我不知道如何以OldClsName优雅的方式标记为已弃用.也许我可以创建OldClsName一个发出警告(记录)并NewClsName从其参数构造对象的函数(使用*args和**kvargs)但它看起来不够优雅(或者它可能是?).
但是,我不知道Python标准库弃用警告是如何工作的.我想可能有一些很好的魔法来处理弃用,例如允许根据某些解释器的命令行选项将其视为错误或静默.
问题是:如何警告用户使用过时的类别名(或一般的过时类).
编辑:函数方法对我不起作用(我已经试过了)因为类有一些类方法(工厂方法),当OldClsName定义为函数时无法调用.以下代码不起作用:
class NewClsName(object):
@classmethod
def CreateVariant1( cls, ... ):
pass
@classmethod
def CreateVariant2( cls, ... ):
pass
def OldClsName(*args, **kwargs):
warnings.warn("The 'OldClsName' class was renamed [...]",
DeprecationWarning )
return NewClsName(*args, **kwargs)
OldClsName.CreateVariant1( ... )
Run Code Online (Sandbox Code Playgroud)
因为:
AttributeError: 'function' object has no attribute 'CreateVariant1'
Run Code Online (Sandbox Code Playgroud)
继承是我唯一的选择吗?说实话,它对我来说看起来不太干净 - 它通过引入不必要的派生来影响类层次结构.此外,OldClsName is not NewClsName在大多数情况下,这不是问题,但如果使用该库的代码编写不当,可能会出现问题.
我还可以创建一个虚拟的,不相关的OldClsName类,并为其中的所有类方法实现构造函数和包装器,但在我看来,这是更糟糕的解决方案.
我重构我的旧代码,并希望根据pep8更改函数的名称.但是我希望保持与系统的旧部分的向后兼容性(项目的完全重构是不可能的,因为函数名称是API的一部分,并且一些用户使用旧的客户端代码).
简单的例子,旧代码:
def helloFunc(name):
print 'hello %s' % name
Run Code Online (Sandbox Code Playgroud)
新:
def hello_func(name):
print 'hello %s' % name
Run Code Online (Sandbox Code Playgroud)
但这两个功能应该有效:
>>hello_func('Alex')
>>'hello Alex'
>>helloFunc('Alf')
>>'hello Alf'
Run Code Online (Sandbox Code Playgroud)
我在考虑:
def helloFunc(name):
hello_func(name)
Run Code Online (Sandbox Code Playgroud)
,但我不喜欢它(在项目中约有50个函数,我觉得它看起来很混乱).
最好的方法是什么(不包括重复的资源)?有可能创建一些通用装饰器吗?
谢谢.
我正在尝试弃用类的属性。
class A:
def __init__(self,
variable1: int,
##to be deprecated
variable2: int )
{....}
Run Code Online (Sandbox Code Playgroud)
预期行为:如果用户尝试使用变量 2,他应该收到警告,指出它已被弃用。