首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中创建函数的深度副本?

如何在Python中创建函数的深度副本?
EN

Stack Overflow用户
提问于 2011-06-30 05:44:21
回答 7查看 12.1K关注 0票数 26

我想用Python制作一个函数的深度副本。根据documentation的说法,复制模块没有帮助,它说:

此模块不复制模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组或任何类似类型等类型。它通过原封不动地返回原始对象来“复制”函数和类(浅层和深层);这与pickle模块处理这些函数和类的方式兼容。

我的目标是拥有两个实现相同但文档字符串不同的函数。

代码语言:javascript
复制
def A():
    """A"""
    pass

B = make_a_deepcopy_of(A)
B.__doc__ = """B"""

那么,如何做到这一点呢?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-06-30 06:46:04

FunctionType构造函数用于制作函数的深层副本。

代码语言:javascript
复制
import types
def copy_func(f, name=None):
    return types.FunctionType(f.func_code, f.func_globals, name or f.func_name,
        f.func_defaults, f.func_closure)

def A():
    """A"""
    pass
B = copy_func(A, "B")
B.__doc__ = """B"""
票数 26
EN

Stack Overflow用户

发布于 2015-06-09 00:18:25

我的目标是拥有两个实现相同但文档字符串不同的函数。

大多数用户都会这样做,比如原始函数是用old_module.py编写的

代码语言:javascript
复制
def implementation(arg1, arg2): 
    """this is a killer function"""

new_module.py

代码语言:javascript
复制
from old_module import implementation as _implementation

def implementation(arg1, arg2):
    """a different docstring"""
    return _implementation(arg1, arg2)

这是重用功能的最直接的方法。它很容易阅读和理解其意图。

然而,也许你对你的主要问题有一个很好的理由:

如何在Python中制作函数的深度副本?

为了保持与Python2和3的兼容性,我建议使用函数的特殊__dunder__属性。例如:

代码语言:javascript
复制
import types

def copy_func(f, name=None):
    '''
    return a function with same code, globals, defaults, closure, and 
    name (or provide a new name)
    '''
    fn = types.FunctionType(f.__code__, f.__globals__, name or f.__name__,
        f.__defaults__, f.__closure__)
    # in case f was given attrs (note this dict is a shallow copy):
    fn.__dict__.update(f.__dict__) 
    return fn

下面是一个用法示例:

代码语言:javascript
复制
def main():
    from logging import getLogger as _getLogger # pyflakes:ignore, must copy
    getLogger = copy_func(_getLogger)
    getLogger.__doc__ += '\n    This function is from the Std Lib logging module.\n    '
    assert getLogger.__doc__ is not _getLogger.__doc__
    assert getLogger.__doc__ != _getLogger.__doc__

一位评论者说:

这不适用于内置函数

对于内置函数,我不会这么做。对于用纯Python编写的函数,我几乎没有理由这样做,我怀疑如果您这样做,您可能做了一些非常错误的事情(尽管我在这里可能是错的)。

如果你想要一个函数做一个内置函数所做的事情,并重用实现,就像复制一样,那么你应该用另一个函数包装这个函数,例如:

代码语言:javascript
复制
_sum = sum
def sum(iterable, start=0):
    """sum function that works like the regular sum function, but noisy"""
    print('calling the sum function')
    return _sum(iterable, start)
票数 24
EN

Stack Overflow用户

发布于 2011-06-30 05:55:20

代码语言:javascript
复制
from functools import partial

def a():
    """Returns 1"""
    return 1

b = partial(a)
b.__doc__ = """Returns 1, OR DOES IT!"""

print help(a)
print help(b)

把它包装成部分的?

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6527633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档