14

我重构了我的旧代码并想根据 pep8 更改函数的名称。但是我想保持与系统旧部分的向后兼容性(完全重构项目是不可能的,因为函数名称是 API 的一部分,并且一些用户使用旧的客户端代码)。

简单的例子,旧代码:

def helloFunc(name):
    print 'hello %s' % name

新的:

def hello_func(name):
    print 'hello %s' % name

但是这两个功能都应该起作用:

>>hello_func('Alex')
>>'hello Alex'
>>helloFunc('Alf')
>>'hello Alf'

我在想:

def helloFunc(name):
    hello_func(name)

,但我不喜欢它(在项目中大约有 50 个功能,我认为它看起来会很乱)。

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

谢谢。

4

4 回答 4

11

我认为目前,最简单的方法是创建对旧函数对象的新引用:

def helloFunc():
    pass

hello_func = helloFunc

当然,如果您将实际函数的名称更改为,然后将别名创建为hello_func

helloFunc = hello_func

这仍然有点混乱,因为它不必要地使您的模块名称空间混乱。为了解决这个问题,您还可以有一个提供这些“别名”的子模块。然后,对于您的用户来说,它就像更改为一样简单import moduleimport module.submodule as module但您不会弄乱您的模块名称空间。

你甚至可以使用inspect自动(未经测试)来做这样的事情:

import inspect
import re
def underscore_to_camel(modinput,modadd):
    """
       Find all functions in modinput and add them to modadd.  
       In modadd, all the functions will be converted from name_with_underscore
       to camelCase
    """
    functions = inspect.getmembers(modinput,inspect.isfunction)
    for f in functions:
        camel_name = re.sub(r'_.',lambda x: x.group()[1].upper(),f.__name__)
        setattr(modadd,camel_name,f)
于 2012-08-16T12:26:51.330 回答
7

虽然其他答案绝对正确,但将函数重命名为新名称并创建一个发出警告的旧名称可能会很有用:

def func_new(a):
    do_stuff()

def funcOld(a):
    import warnings
    warnings.warn("funcOld should not be called any longer.")
    return func_new(a)
于 2012-08-16T12:48:11.470 回答
4

您可以将函数对象绑定到模块命名空间中的另一个名称,例如:

def funcOld(a):
    return a

func_new = funcOld
于 2012-08-16T12:27:22.723 回答
2

由于您的问题听起来很像弃用或类似的问题,我强烈建议您使用装饰器来获得更简洁的代码。事实上,另一个线程中的某个人已经为您创建了这个

于 2016-08-17T11:01:13.557 回答