我有一个返回函数的包装函数.有没有办法以编程方式设置返回函数的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我得到一个错误: …
有没有人知道提供logsumexp-function的开源数值C库?
该logsumexp(a)函数计算数组a的分量的指数log(e ^ {a_1} + ... e ^ {a_n})的总和,避免数值溢出.
我有一个C函数来规范化日志空间中的数组行(这可以防止数字下溢).
我的C函数的原型如下:
void normalize_logspace_matrix(size_t nrow, size_t ncol, double* mat);
Run Code Online (Sandbox Code Playgroud)
你可以看到它需要一个指向数组的指针并在适当的位置修改它.C代码当然假设数据被保存为C连续数组,即行连续.
我使用Cython(导入并cdef extern from省略)将函数包装如下:
def normalize_logspace(np.ndarray[np.double_t, ndim=2] mat):
cdef Py_ssize_t n, d
n = mat.shape[0]
d = mat.shape[1]
normalize_logspace_matrix(n, d, <double*> mat.data)
return mat
Run Code Online (Sandbox Code Playgroud)
大多数情况下,numpy-arrays是行连续的,函数运行正常.但是,如果先前已转换了numpy-array,则不会复制数据,而只返回数据的新视图.在这种情况下,我的函数失败,因为数组不再是行连续的.
我可以通过将数组定义为具有Fortran连续顺序来解决这个问题,这样在转置后它将是C连续的:
A = np.array([some_func(d) for d in range(D)], order='F').T
A = normalize_logspace(A)
Run Code Online (Sandbox Code Playgroud)
显然,这非常容易出错,用户必须注意数组的顺序是正确的,这是用户在Python中不需要关心的.
使用行和列连续数组的最佳方法是什么?我假设在Cython中进行某种数组顺序检查是可行的方法.当然,我更喜欢不需要将数据复制到新数组的解决方案,但我几乎认为这是必要的.
我想使用Celery在带有四张Tesla卡的GPU服务器上运行作业.我用一个由四名工人组成的工作人员来管理芹菜工人,这样每张卡片总能运行一份工作.
我的问题是如何指导工人每个声称一个GPU.目前,我依赖于工作进程应该都具有连续进程ID的假设:
device_id = os.getpid() % self.ndevices
Run Code Online (Sandbox Code Playgroud)
但是,我不能保证始终可以工作,即当工作进程随着时间的推移重新启动时.理想情况下,我想直接获得每个工人的ID.有人可以告诉我是否可以从任务中检查工作人员,或者可以建议不同的解决方案来跨GPU分配工作?
如果我有一个依赖于某些C库的Python包(比如用于数值计算的Gnu Scientific Library(GSL)),那么将库与我的代码捆绑在一起是一个好主意吗?
我想让我的软件包尽可能易于安装,并且我不希望他们必须手动下载C库并提供包含路径.此外,我始终可以确保我发布的库版本与我的代码兼容.
但是,如果用户已经安装了库,是否可能存在冲突,或者是否有任何其他原因导致我不应该这样做?
我知道我可以通过提供二进制分发使用户更容易,但我想避免为所有可能的操作系统维护二进制分发.所以,我想坚持使用源代码,但对于用户(自豪地拥有C编译器),安装应该如此简单python setup.py install.
我想用matplotlib创建一个动画来监视聚类算法的收敛.它应该在第一次调用时绘制我的数据的散点图,并在每次更新绘图时绘制误差椭圆.我正在尝试使用canvas_copy_from_bbox()并restore_region()保存散点图,然后在我更新绘图时绘制一组新的省略号.但是,代码只是将旧椭圆绘制在旧椭圆之上,而不先清除先前的绘图.我怀疑,不知何故,这种方法Ellipse()与add_path()命令不兼容,但我不知道如何解决这个问题.
这是代码:
import wx
import math
from math import pi
from matplotlib.patches import Ellipse
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import \
FigureCanvasWxAgg as FigureCanvas
TIMER_ID = wx.NewId()
class _MonitorPlot(wx.Frame):
def __init__(self, data, scale=1):
self.scale = scale
wx.Frame.__init__(self, None, wx.ID_ANY,
title="FlowVB Progress Monitor", size=(800, 600))
self.fig = Figure((8, 6), 100)
self.canvas = FigureCanvas(self, wx.ID_ANY, self.fig)
self.ax = self.fig.add_subplot(111)
x_lims = [data[:, 0].min(), data[:, 0].max()]
y_lims = [data[:, 1].min(), data[:, 1].max()]
self.ax.set_xlim(x_lims)
self.ax.set_ylim(y_lims) …Run Code Online (Sandbox Code Playgroud) 是否有更优雅的方式来编写以下Python?
[foo() for i in range(10)]
Run Code Online (Sandbox Code Playgroud)
我想在列表中累积foo()的结果,但我不需要迭代器i.
我正在尝试加速我的Numpy代码,并决定我想实现一个特定的函数,我的代码大部分时间都在C中.
我实际上是C中的新手,但我设法编写了一个函数,它将矩阵中的每一行规范化为1.我可以编译它并用一些数据(在C中)测试它并且它做我想要的.那时我为自己感到骄傲.
现在我试图从Python中调用我的光荣函数,它应该接受一个2d-Numpy数组.
我尝试过的各种事情都是
痛饮
SWIG + numpy.i
ctypes的
我的功能有原型
void normalize_logspace_matrix(size_t nrow, size_t ncol, double mat[nrow][ncol]);
Run Code Online (Sandbox Code Playgroud)
因此它需要一个指向可变长度数组的指针并将其修改到位.
我尝试了以下纯SWIG接口文件:
%module c_utils
%{
extern void normalize_logspace_matrix(size_t, size_t, double mat[*][*]);
%}
extern void normalize_logspace_matrix(size_t, size_t, double** mat);
Run Code Online (Sandbox Code Playgroud)
然后我会做(在Mac OS X 64bit上):
> swig -python c-utils.i
> gcc -fPIC c-utils_wrap.c -o c-utils_wrap.o \
-I/Library/Frameworks/Python.framework/Versions/6.2/include/python2.6/ \
-L/Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/ -c
c-utils_wrap.c: In function ‘_wrap_normalize_logspace_matrix’:
c-utils_wrap.c:2867: warning: passing argument 3 of ‘normalize_logspace_matrix’ from incompatible pointer type
> g++ -dynamiclib c-utils.o -o _c_utils.so
Run Code Online (Sandbox Code Playgroud)
在Python中,我在导入模块时遇到以下错误:
>>> import c_utils
Traceback …Run Code Online (Sandbox Code Playgroud)