为方便起见,我想创建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)
我无法解释这一点.有人吗?
现在我正在使用闭包来生成像这个简化示例中的函数:
def constant_function(constant):
def dummyfunction(t):
return constant
return dummyfunction
Run Code Online (Sandbox Code Playgroud)
然后将这些生成的函数传递给自定义类的init方法,该类将它们存储为实例属性.缺点是这使得类实例难以理解.所以我想知道是否有办法创建函数生成器来避免闭包.
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) 我计划围绕数值模拟编写一个小型 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) 我有一个问题,理解为什么以下不起作用:
我有一个可以是三维或六维的阵列前因子.我有一个有四个维度的阵列偶极子.前三个维度偶极场比赛的最后三个维度前因子.
由于我不知道前因子的形状,我使用省略号来说明前因子中的三个可选维度:
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上也提出了同样的问题,但还没有令人满意的答案.
在查看Stackoverflow时 - 关于何时引发异常以及何时简单地返回NonePython函数的问题,新出现的图片是您应该使用异常来表示意外行为,None否则返回.
但是,迭代的for循环是通过方法StopIteration引发的Exception 实现的next(),尽管最终到达iterable的"end"通常并不意外.为什么for循环迭代迭代实现的方式是什么?
我试图通过将一些阻塞代码移动到单独的 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 时,它按预期工作,但我不明白为什么。
python ×6
closures ×1
datetime ×1
ellipsis ×1
exception ×1
function ×1
iterator ×1
matplotlib ×1
numpy ×1
numpy-einsum ×1
pickle ×1
pipe ×1
pyqt ×1
python-2.7 ×1
python-3.5 ×1
qthread ×1
qtimer ×1
subprocess ×1
timedelta ×1
tkinter ×1