相关疑难解决方法(0)

如何以编程方式设置文档字符串?

我有一个返回函数的包装函数.有没有办法以编程方式设置返回函数的docstring?如果我可以写信,__doc__我会做以下事情:

def wrapper(a):
    def add_something(b):
       return a + b
    add_something.__doc__ = 'Adds ' + str(a) + ' to `b`'
    return add_something
Run Code Online (Sandbox Code Playgroud)

然后我就能做到

>>> add_three = wrapper(3)
>>> add_three.__doc__
'Adds 3 to `b`
Run Code Online (Sandbox Code Playgroud)

但是,由于__doc__是只读的,我不能这样做.什么是正确的方法?


编辑:好的,我想保持这个简单,但当然这不是我真正想要做的.虽然一般来说__doc__在我的情况下是可写的但事实并非如此.

我正在尝试unittest自动创建测试用例.我有一个包装函数,它创建一个类对象,它是以下的子类unittest.TestCase:

import unittest
def makeTestCase(filename, my_func):
    class ATest(unittest.TestCase):
        def testSomething(self):
            # Running test in here with data in filename and function my_func
            data  = loadmat(filename)
            result = my_func(data)
            self.assertTrue(result > 0)

    return ATest
Run Code Online (Sandbox Code Playgroud)

如果我创建这个类并尝试设置docstring testSomething我得到一个错误: …

python docstring

45
推荐指数
5
解决办法
2万
查看次数

如何创建python函数的副本

是否有可能创建python函数的真实副本?最明显的选择是http://docs.python.org/2/library/copy.html,但我读到了:

它通过返回原始对象来"复制"函数和类(浅和深);

我需要一个真正的副本,因为我可能会更改该函数的某些属性.

更新:

我知道评论中提到的所有可能性.我的用例基于元编程,我从一些声明性规范中构造类.完整的细节对于SO来说太长了,但基本上我有一个类似的功能

def do_something_usefull(self,arg):
    self.do_work()
Run Code Online (Sandbox Code Playgroud)

我将这个方法添加到各个类.类可以完全不相关.使用mixin类不是一个选项:我将有许多这样的函数,并最终为每个函数添加一个基类.我目前的"解决方法"是将此函数包装在"工厂"中,如下所示:

def create_do_something():
    def do_something_usefull(self,arg):
        self.do_work()
Run Code Online (Sandbox Code Playgroud)

这样我总是得到一个新的do_something_useful函数,但是我必须像这样包装我的所有函数.

我相信我,我知道,这不是"正常"的OO编程.我知道如何解决"通常"这样的问题.但这是一个动态代码生成器,我希望尽可能保持轻量级和简单的一切.由于python函数是非常普通的对象,我不认为如何复制它们太奇怪了!?

python deep-copy

20
推荐指数
1
解决办法
1万
查看次数

Python functools部分效率

我一直在使用Python,我设置了以下代码情况:

import timeit

setting = """
import functools

def f(a,b,c):
    pass

g = functools.partial(f,c=3)    
h = functools.partial(f,b=5,c=3)   
i = functools.partial(f,a=4,b=5,c=3)
"""

print timeit.timeit('f(4,5,3)', setup = setting, number=100000)
print timeit.timeit('g(4,5)', setup = setting, number=100000)
print timeit.timeit('h(4)', setup = setting, number=100000)
print timeit.timeit('i()', setup = setting, number=100000)
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

f: 0.181384086609
g: 0.39066195488
h: 0.425783157349
i: 0.391901016235
Run Code Online (Sandbox Code Playgroud)

为什么对部分函数的调用需要更长时间?部分函数是将参数转发到原始函数还是映射静态参数?而且,在Python中是否有一个函数返回一个函数的主体,假定所有参数都是预定义的,就像函数i一样?

python function partial functools

18
推荐指数
2
解决办法
3285
查看次数

有什么方法可以回到原来的功能吗?

假设我想通过应用某些公式来暂时替换某个类的某些动作something.action,

something.action = apply(something.action)
Run Code Online (Sandbox Code Playgroud)

稍后,我想something通过执行类似的操作将原始操作方法应用回实例

something.action = ...
Run Code Online (Sandbox Code Playgroud)

我该怎么做到这一点?

python function

1
推荐指数
1
解决办法
83
查看次数

标签 统计

python ×4

function ×2

deep-copy ×1

docstring ×1

functools ×1

partial ×1