我想用Python制作一个函数的深度副本。根据documentation的说法,复制模块没有帮助,它说:
此模块不复制模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组或任何类似类型等类型。它通过原封不动地返回原始对象来“复制”函数和类(浅层和深层);这与pickle模块处理这些函数和类的方式兼容。
我的目标是拥有两个实现相同但文档字符串不同的函数。
def A():
"""A"""
pass
B = make_a_deepcopy_of(A)
B.__doc__ = """B"""
那么,如何做到这一点呢?
发布于 2011-06-30 06:46:04
FunctionType构造函数用于制作函数的深层副本。
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"""
发布于 2015-06-09 00:18:25
我的目标是拥有两个实现相同但文档字符串不同的函数。
大多数用户都会这样做,比如原始函数是用old_module.py
编写的
def implementation(arg1, arg2):
"""this is a killer function"""
在new_module.py
中
from old_module import implementation as _implementation
def implementation(arg1, arg2):
"""a different docstring"""
return _implementation(arg1, arg2)
这是重用功能的最直接的方法。它很容易阅读和理解其意图。
然而,也许你对你的主要问题有一个很好的理由:
如何在Python中制作函数的深度副本?
为了保持与Python2和3的兼容性,我建议使用函数的特殊__dunder__
属性。例如:
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
下面是一个用法示例:
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编写的函数,我几乎没有理由这样做,我怀疑如果您这样做,您可能做了一些非常错误的事情(尽管我在这里可能是错的)。
如果你想要一个函数做一个内置函数所做的事情,并重用实现,就像复制一样,那么你应该用另一个函数包装这个函数,例如:
_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)
发布于 2011-06-30 05:55:20
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)
把它包装成部分的?
https://stackoverflow.com/questions/6527633
复制相似问题