una suma propias otra matematicas lista importar función funciones funcion ejemplos dentro definir crea como python function copy deep-copy

suma - ¿Cómo puedo hacer una copia profunda de una función en Python?



importar funciones en python (5)

El constructor FunctionType se usa para hacer una copia profunda de una función.

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"""

Me gustaría hacer una copia profunda de una función en Python. El módulo de copia no es útil, según la documentación , que dice:

Este módulo no copia tipos como módulo, método, seguimiento de pila, marco de pila, archivo, socket, ventana, matriz o tipos similares. Sí "copia" funciones y clases (superficiales y profundas), al devolver el objeto original sin cambios; esto es compatible con la forma en que estos son tratados por el módulo Pickle.

Mi objetivo es tener dos funciones con la misma implementación pero con diferentes docstrings.

def A(): """A""" pass B = make_a_deepcopy_of(A) B.__doc__ = """B"""

Entonces, ¿cómo puede hacerse esto?


Para mejorar la respuesta de Glenn y mantener esto compatible con Python 3, recomiendo usar los atributos __dunder__ . Por ejemplo:

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

Y aquí hay un ejemplo de uso:

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__ assert getLogger.__doc__ != _getLogger.__doc__

Un comentarista dice:

Esto no puede funcionar para funciones incorporadas

Bueno, yo no haría esto para una función incorporada. Tengo muy pocas razones para hacer esto para funciones escritas en Python puro, y mi sospecha es que si estás haciendo esto, probablemente estés haciendo algo muy malo (aunque podría estar equivocado aquí).

Naturalmente, si quiere una función que hace lo que hace una función incorporada, y reutiliza la implementación, como lo haría una copia, entonces debería envolver la función con otra función, por ejemplo:

_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)


ponerlo en una función:

def makefunc( docstring ): def f(): pass f.__doc__ = docstring return f f = makefunc(''I am f'') g = makefunc("I am f too")


def A(): """A""" pass def B(): """B""" return A()


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)

¿Envolverlo como parcial?