相关疑难解决方法(0)

如何制作一系列功能装饰器?

如何在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 decorator python-decorators

2647
推荐指数
17
解决办法
49万
查看次数

如何警告类(名称)弃用

我重命名了一个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类,并为其中的所有类方法实现构造函数和包装器,但在我看来,这是更糟糕的解决方案.

python class backwards-compatibility deprecation-warning

43
推荐指数
6
解决办法
2万
查看次数

重命名功能,保持向后兼容性

我重构我的旧代码,并希望根据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个函数,我觉得它看起来很混乱).

最好的方法是什么(不包括重复的资源)?有可能创建一些通用装饰器吗?

谢谢.

python refactoring

11
推荐指数
2
解决办法
8025
查看次数

弃用python中类的属性

我正在尝试弃用类的属性。

class A:
   def __init__(self,
   variable1: int,
   ##to be deprecated
   variable2: int )
   {....}
Run Code Online (Sandbox Code Playgroud)

预期行为:如果用户尝试使用变量 2,他应该收到警告,指出它已被弃用。

python deprecated deprecation-warning

-3
推荐指数
2
解决办法
43
查看次数