小编jan*_*jan的帖子

子类化datetime.timedelta时的奇怪行为

为方便起见,我想创建datetime.timedelta的子类.我们的想法是定义一个类:

class Hours(datetime.timedelta):
    def __init__(self, hours):
        super(Hours, self).__init__(hours=hours)
Run Code Online (Sandbox Code Playgroud)

所以我可以快速创建这样的timedeltas:

x = Hours(n)
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码生成n天而不是n小时的timedelta.作为示例,请查看以下ipython会话:

In [1]: import datetime

In [2]: class Hours(datetime.timedelta):
   ...:     def __init__(self, hours):
   ...:         super(Hours, self).__init__(hours=hours)
   ...:         

In [3]: print(Hours(10))
Out[3]: 10 days, 0:00:00
Run Code Online (Sandbox Code Playgroud)

我无法解释这一点.有人吗?

python datetime timedelta python-2.7

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

在python中生成没有闭包的函数

现在我正在使用闭包来生成像这个简化示例中的函数:

def constant_function(constant):
    def dummyfunction(t):
        return constant
    return dummyfunction
Run Code Online (Sandbox Code Playgroud)

然后将这些生成的函数传递给自定义类的init方法,该类将它们存储为实例属性.缺点是这使得类实例难以理解.所以我想知道是否有办法创建函数生成器来避免闭包.

python closures function pickle

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

python subprocess:使用 subprocess.PIPE 时输出顺序发生变化

outer.py当我编写一个名为contains的 python 脚本时

p = subprocess.Popen(['./inner.py'])
print('Called inner.py without options, waiting for process...')
p.wait()
print('Waited for inner.py without options')

p = subprocess.Popen(['./inner.py'], stdout=subprocess.PIPE)
print('Called inner.py with PIPE, communicating...')
b_out, b_err = p.communicate()
out = b_out.decode('utf8')
print('out is "{}"'.format(out))
Run Code Online (Sandbox Code Playgroud)

以及一个inner.py含有

print("inner: Echoing Hallo")
p = subprocess.Popen(['echo', 'hallo'])
print("inner: Waiting for Echo to finish...")
p.wait()
print("inner: Waited for Echo")
Run Code Online (Sandbox Code Playgroud)

outer.py从终端调用时我得到以下信息:

Called inner.py without options, waiting for process...
inner: Echoing Hallo
inner: Waiting for Echo to finish...
hallo
inner: …
Run Code Online (Sandbox Code Playgroud)

python subprocess pipe python-3.5

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

Tkinter:通过多处理启动进程会创建不需要的新窗口

我计划围绕数值模拟编写一个小型 GUI,这就是我现在使用 Tkinter 的原因。模拟应在单独的进程中从 GUI 启动。为了玩一下,我定义了一个函数 random_process 来生成成对的 randn 数字(这应该是一个真正的模拟过程)。由于该函数要在单独的进程中启动,因此两个 mp.Event 对象和一个 mp.Pipe 对象作为参数传递。主应用程序可以使用一个事件向进程请求累积的数据,另一个事件用作“毒丸”来杀死“模拟”进程。然后使用管道来传递数据。在主应用程序中,我使用 Tkinter 的后函数定期检查新数据是否到达,然后绘制它。启动和停止“模拟过程”是通过主应用程序中的按钮完成的,从中请求数据也是如此。

至少这个想法是这样的,实际上该程序运行得并不好。当我点击“开始!”时 按钮用于启动模拟过程,此时会出现第二个 Tkinter 窗口,与主窗口相同。我完全不知道为什么会发生这种情况。与进程的通信也不起作用,似乎没有发送数据。在谷歌搜索解决方案时,我发现了一个 Tkinter 程序启动进程并与它们对话的工作示例,但我没有找到是什么让它在我的情况下不起作用。有人有线索吗?

顺便说一句,操作系统是 Windows-7。

干杯,简

import matplotlib
matplotlib.use('TkAgg')
import time
import multiprocessing as mp
import Tkinter as Tk
import numpy.random as npr
import matplotlib.figure
import matplotlib.backends.backend_tkagg as tkagg

def random_process(delay, data_request, data_in, poison):
    while not poison.is_set():
        time.sleep(delay)
        print("Generating pair of random numbers...")
        x,y = npr.randn(), npr.randn()
        try:
            random_process.l.append((x,y))
        except:
            random_process.l = [(x,y)]
        if data_request.is_set():
            data_request.clear()
            try:
                ll = len(random_process.l)
                if …
Run Code Online (Sandbox Code Playgroud)

python tkinter matplotlib multiprocessing

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

省略号广播在numpy.einsum

我有一个问题,理解为什么以下不起作用:

我有一个可以是三维或六维的阵列前因子.我有一个有四个维度的阵列偶极子.前三个维度偶极场比赛的最后三个维度前因子.

由于我不知道前因子的形状,我使用省略号来说明前因子中的三个可选维度:

numpy.einsum('...lmn,lmno->...o', prefactor, dipoles)
Run Code Online (Sandbox Code Playgroud)

(在这里的示例中,prefactor.shape是(1,1,1,160,160,128),dipoles.shape是(160,160,128,3).执行时,我得到错误:

操作数1没有足够的尺寸来匹配广播,并且无法扩展,因为在开头和结尾都指定了爱因斯坦和下标

但是,当我向第二个术语添加省略号时,它确实有效:

numpy.einsum('...lmn,...lmno->...o', prefactor, dipoles)
Run Code Online (Sandbox Code Playgroud)

只是我不明白为什么,因为那里不应该有省略号.有人知道这里发生了什么吗?

http://comments.gmane.org/gmane.comp.python.numeric.general/53705上也提出了同样的问题,但还没有令人满意的答案.

python numpy ellipsis numpy-einsum numpy-broadcasting

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

为什么使用StopIteration Exception实现迭代的结束

在查看Stackoverflow时 - 关于何时引发异常以及何时简单地返回NonePython函数的问题,新出现的图片是您应该使用异常来表示意外行为,None否则返回.

但是,迭代的for循环是通过方法StopIteration引发的Exception 实现的next(),尽管最终到达iterable的"end"通常并不意外.为什么for循环迭代迭代实现的方式是什么?

python error-handling iterator exception

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

尽管移动到不同的 QThread,pyqt 代码仍处于阻塞状态

我试图通过将一些阻塞代码移动到单独的 QThread 来使我的 PyQt4 程序响应更快。由于它不起作用,我创建了这个最小的示例作为演示:

import sys
import time
from PyQt4 import QtCore, QtGui


class Sleeper(QtCore.QObject):

    def __init__(self):
        super(Sleeper, self).__init__()
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.sleep)
        self.timer.start(1000)

    def sleep(self):
        time.sleep(1)


class MyGUI(QtGui.QMainWindow):

    def __init__(self, parent=None):
        super(MyGUI, self).__init__(parent)
        self.button = QtGui.QPushButton("hello", self)
        self.sleeper = Sleeper()
        self.thread = QtCore.QThread()
        self.sleeper.moveToThread(self.thread)
        self.thread.start()


if __name__ == "__main__":
    qapp = QtGui.QApplication(sys.argv)
    my_gui = MyGUI()
    my_gui.show()
    qapp.exec_()
Run Code Online (Sandbox Code Playgroud)

这段代码的问题是 sleep 命令仍然阻塞用户界面。我发现当我在 Sleeper 类之外创建、连接和运行 QTimer 时,它按预期工作,但我不明白为什么。

pyqt qthread qtimer

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