首页 > 解决方案 > 在 Python 中指定函数别名

问题描述

在 Python 中至少有两种不同的方法来指定函数的别名。给定一个函数:

def fun1(a, b=5):
    return a+b

你可以像这样创建一个别名:

def fun2(*args, **kwargs):
    return fun1(*args, **kwargs)

或像这样:

fun3 = fun1

第一个在内存中创建一个新函数,而第二个只是指向原始函数的指针。使用其中一个有什么好处吗?

标签: pythonfunctionalias

解决方案


第一个函数在 Python 中经常用于装饰其他函数。这是一个“代理功能”。

装饰师

返回另一个函数的函数,通常使用 @wrapper 语法作为函数转换应用。装饰器的常见示例是 classmethod() 和 staticmethod()。

装饰器语法只是语法糖,以下两个函数定义在语义上是等价的:

   ...
f = staticmethod(f)

@staticmethod
def f(...):
    ...

类也存在相同的概念,但在那里不太常用。有关装饰器的更多信息,请参阅函数定义和类定义的文档。

这对于构建干净的代码非常有帮助。更多信息请访问https://docs.python.org/3/glossary.html#term-decorator

第二个只是将函数分配给某个地方,变量,对象或类属性等。通常用于 Monkey Patching

猴子补丁是程序在本地扩展或修改支持系统软件的一种方式(仅影响程序的运行实例)。

该术语的定义因使用它的社区而异。在 Ruby、Python 和许多其他动态编程语言中,monkey patch 一词仅指在运行时对类或模块的动态修改,其动机是为了修补现有的第三方代码作为解决错误或功能的方法不按自己的意愿行事。其他在运行时修改类的形式根据其不同的意图有不同的名称。例如,在 Zope 和 Plone 中,安全补丁通常使用动态类修改来交付,但它们被称为修补程序

更多信息请访问https://en.wikipedia.org/wiki/Monkey_patch


推荐阅读