我最近发现了Python的property内置函数,它将类方法getter和setter伪装成类的属性.我现在很想以我认为不合适的方式使用它.
property如果类A具有_x您想要限制的允许值的属性,那么使用关键字显然是正确的做法; 即,它将取代用C++编写的构造getX()和setX()构造.
但是在哪里将函数作为属性是合适的呢?例如,如果你有
class Vertex(object):
def __init__(self):
self.x = 0.0
self.y = 1.0
class Polygon(object):
def __init__(self, list_of_vertices):
self.vertices = list_of_vertices
def get_vertex_positions(self):
return zip( *( (v.x,v.y) for v in self.vertices ) )
Run Code Online (Sandbox Code Playgroud)
是否适合添加
vertex_positions = property( get_vertex_positions )
Run Code Online (Sandbox Code Playgroud)
?
让发电机看起来像财产一样可以吗?想象一下,如果我们的代码中的更改意味着我们不再Polygon.vertices以相同的方式存储.那么添加它可以Polygon吗?
@property
def vertices(self):
for v in self._new_v_thing:
yield v.calculate_equivalent_vertex()
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个适用于多个平台和编译器的小代码.我使用断言,其中大部分可以被关闭,但与PGI的编译时pgicpp使用-mp了支持OpenMP,它会自动使用该--no_exceptions选项:无处不在我的代码以"扔"语句生成一个致命编译器错误.("禁用异常处理支持")
有没有define我可以测试的宏来隐藏throwPGI上的语句?我经常使用gcc,有GCC_VERSION等等.我在PGI中找不到任何描述这些宏的文档.
我经常使用MacVim(和gvim).我熟悉并使用了很多基本的移动命令(的b,w,$,0,G).然而,对于很多事情 - 例如在屏幕上选择特定线条或跳到不同线路中的特定列 - 我使用鼠标(有时与我的左手在键盘上一致).它还有助于我的鼠标有一个滚轮和更改标签的按钮.
我还需要承认......我使用键盘上的箭头键而不是hjkl.
我认为通过不必从插入模式中逃脱,以及将双手放在键盘的主要部分上,我的速度(以及计算机的姿势)将得到改善.
是什么让你放弃了鼠标?在行和列之间快速移动,滚动等最有用的快捷方式是什么?
这个问题的灵感来自最近这篇文章
我无法os.utime在mac上正确设置修改时间(Mac OS X 10.6.2,运行Python 2.6.1 /usr/bin/python).它与touch实用程序不一致,并且与Finder的"获取信息"窗口中显示的属性不一致.
请考虑以下命令序列.纯文本中的"已创建"和"已修改"时间是指查找程序中"获取信息"窗口中显示的属性.提醒一下,os.utime需要参数(filename, (atime, mtime)).
>>> import os
>>> open('tempfile','w').close()
Run Code Online (Sandbox Code Playgroud)
'created'和'modified'都是当前时间.
>>> os.utime('tempfile', (1000000000, 1500000000) )
Run Code Online (Sandbox Code Playgroud)
'created'是当前时间,'modified'是2017年7月13日.
>>> os.utime('tempfile', (1000000000, 1000000000) )
Run Code Online (Sandbox Code Playgroud)
"创造"和"修改"都是2001年9月8日.
>>> os.path.getmtime('tempfile')
1000000000.0
>>> os.path.getctime('tempfile')
1269021939.0
>>> os.path.getatime('tempfile')
1269021951.0
Run Code Online (Sandbox Code Playgroud)
......但是os.path.get?time并os.stat没有反映出来.
>>> os.utime('tempfile', (1500000000, 1000000000) )
Run Code Online (Sandbox Code Playgroud)
"创造"和"修改" 仍然是2001年9月8日.
>>> os.utime('tempfile', (1500000000, 1500000000) )
Run Code Online (Sandbox Code Playgroud)
'created'是2001年9月8日,'modified'是2017年7月13日.
我不确定这是Python问题还是Mac stat问题.当我退出Python shell并运行时
touch -a -t 200011221234 tempfile
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,修改和创建时间都没有改变.然后我跑了
touch -m -t 200011221234 tempfile …Run Code Online (Sandbox Code Playgroud) 我发现dynamic_cast在我期望它的情况下不起作用,并且typeid在运行时查看对象使得情况更加清晰.我只想要从基础到派生的演员,我无法弄清楚为什么它不起作用.
我有一个这样的类结构:
class BoundaryCondition {
public:
virtual void DoSomething() = 0;
virtual ~BoundaryCondition() { /* * */ }
}
class ReflectingBc : BoundaryCondition {
public:
virtual void DoSomething();
}
class MarshakBc : BoundaryCondition {
public:
virtual void DoSomething();
MarshakBc(double value);
void changeValueLaterOn(double value);
private:
double value_;
}
Run Code Online (Sandbox Code Playgroud)
我(基本上)有一个std::vector<BoundaryCondition*>代表问题部分边界条件的东西.我希望能够接受它,vector并且对于其中的所有MarshakBc对象,请致电changeValueLaterOn.所以我有一个看起来像的循环
for (std::vector<BoundaryCondition*>::iterator bc = bcPtrs_.begin();
bc != bcPtrs_.end(); ++bc)
{
if (std::string(typeid(MarshakBc).name()) == std::string(typeid(**bc).name()) )
{
std::cerr << "SAME! "; …Run Code Online (Sandbox Code Playgroud) 我想运行一个系统进程,拦截输出,并在Python脚本中逐行实时修改它.
我最好的尝试,等待打印前完成的过程,是:
#!/usr/bin/env python
import subprocess
cmd = "waitsome.py"
proc = subprocess.Popen(cmd, shell=True, bufsize=256, stdout=subprocess.PIPE)
for line in proc.stdout:
print ">>> " + line.rstrip()
Run Code Online (Sandbox Code Playgroud)
脚本waitsome.py只需每半秒打印一行:
#!/usr/bin/env python
import time
from sys import stdout
print "Starting"
for i in range(0,20):
time.sleep(0.5)
print "Hello, iteration", i
stdout.flush()
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的解决方案subprocess允许实时迭代输出?我必须使用线程吗?
曾几何时,我用Perl编写脚本,这是小菜一碟:
open(CMD, "waitsome.py |");
while (<CMD>) {
print ">>> $_";
}
close(CMD);
Run Code Online (Sandbox Code Playgroud) 使用时mpirun,是否可以^C在正在运行的代码中捕获信号(例如,由生成的SIGINT )?
例如,我正在运行并行化的python代码。except KeyboardInterrupt当python blah.py我自己运行时,我可以捕获那些错误,但是当我运行时,则无法捕获mpirun -np 1 python blah.py。
有人有建议吗?甚至找到如何在C或C ++编译程序中捕获信号也将是一个有用的开始。
如果我向生成的Python进程发送信号,它们可以正确处理这些信号;但是,发送到父orterun进程的信号(即,由于超过了群集上的墙时间,或在终端上按了Control-C)将立即杀死所有内容。
我正在使用SWIG将一些C++代码粘合到Python(2.6)上,并且该粘合剂的一部分包括一段代码,它将大数据字段(数百万个值)从C++端转换为Numpy数组.我能想出的最好的方法是为类实现一个迭代器,然后提供一个Python方法:
def __array__(self, dtype=float):
return np.fromiter(self, dtype, self.size())
Run Code Online (Sandbox Code Playgroud)
问题是每个迭代器next调用都非常昂贵,因为它必须通过大约三到四个SWIG包装器.这需要太长时间.我可以保证C++数据是连续存储的(因为它们存在于std :: vector中),并且感觉Numpy应该能够指向该数据的开头以及它包含的值的数量,并且直接阅读.
有没有办法通过一个指针internal_data_[0]和值internal_data_.size(),以numpy的,以便它可以直接,不用所有的Python开销访问或复制的数据?
我想在 gvim(以及 MacVim)中重新映射修改后的点击,但某些修饰符组合有效而其他组合无效。在 Linux 机器上的 gvim 中,我想在我输入的任何地方插入“hello”:
:noremap <C-S-LeftMouse> <LeftMouse>ihello<ESC>
Run Code Online (Sandbox Code Playgroud)
但是,该命令不起作用:control-shift-click 保留其原始行为。但是我可以在 gvim 中重新映射 control-click:
:noremap <C-LeftMouse> <LeftMouse>ihello<ESC>
Run Code Online (Sandbox Code Playgroud)
在 MacVim 中,command-shift-click<D-S-LeftMouse>同样没有响应,大多数其他修改后的点击也是如此。
我怎样才能真正重新映射修改后的鼠标点击?
为什么返回std::pair或boost::tuple要少得多效率比参考返回?在我测试的实际代码中,通过非const引用而不是std::pair在内核中设置数据可以将代码加速20%.
作为一个实验,我查看了三个最简单的情况,包括将两个(预定义的)整数添加到两个整数:
使用内部内联函数通过引用修改整数
使用两个内部内联函数按值返回整数
使用内部内联函数返回复制到结果的std :: pair.
使用g++ -c $x -Wall -Wextra -O2 -S相同的汇编代码编译结果,以便按引用传递并按值返回整数:
__Z7getPairiRiS_:
LFB19:
pushq %rbp
LCFI0:
leal 1023(%rdi), %eax
addl $31, %edi
movl %eax, (%rsi)
movq %rsp, %rbp
LCFI1:
movl %edi, (%rdx)
leave
ret
Run Code Online (Sandbox Code Playgroud)
(通过参考代码:
#include <utility>
inline void myGetPair(const int inp, int& a, int& b) {
a = 1023 + inp;
b = 31 + inp;
}
void getPair(const int inp, int& a, int& b) {
myGetPair(inp, a, …Run Code Online (Sandbox Code Playgroud) 我有一点问题.我有一个程序,它将为潜力绘制波函数,当我使用绘图中的选项(使用pylab)' - '时它看起来很好:例如:http://img41.imageshack.us/img41/8798/59138635 . PNG
如果我使用'o'我会得到:http: //img16.imageshack.us/img16/3741/22378006.png
你看它看起来很难看:
是否有一种简单的方法可以使圆圈更加间隔,或者这取决于代码的细节?
代码是:
from math import *
from scipy.special import *
from pylab import *
from scipy.linalg import *
firebrick=(178./255.,34./255.,34./255.)
indianred=(176./255.,23./255.,31./255.)
steelblue=(70./255.,130./255.,180./255.)
slategray1=(198./255.,226./255.,255./255.)
slategray4=(108./255.,123./255.,139./255.)
lavender=(230./255.,230./255.,230./255.)
cobalt=(61./255.,89./255.,171./255.)
midnightblue=(25./255.,25./255.,112./255.)
forestgreen=(34./255.,139./255.,34./255.)
#grid
Nmesh=512
L=4.0
dx=L/Nmesh
Xmax=L
x=arange(-L,L+0.0001,dx)
Npts=len(x)
numwav=2 #number of wave function that is being drawn
V=zeros([Npts],float)
for i in range(Npts):
V[i]=x[i]**4
a=zeros([2,Npts-2],float)
wave=zeros([Npts],float)
wave1=zeros([Npts],float)
encor=3.0/4*(3.0/4)**(1.0/3)
#numerical solution
for i in range(1,Npts-1,1):
a[0,i-1]= 1.0/dx**2+V[i] #diagonal elements
a[1,i-1]=-1.0/dx**2/2 #the elements below the …Run Code Online (Sandbox Code Playgroud) 我第一次启动python shell时有以下名称是什么?它们看起来不像以下功能__builtins__:
>>> dir(__name__)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
'__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__',
'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '_formatter_field_name_split', '_formatter_parser',
'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace',
'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split',
'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper',
'zfill']
Run Code Online (Sandbox Code Playgroud) 到目前为止,我所有的定义都是定义.
double power(double base, int exponent);
double factorial(double n);
Run Code Online (Sandbox Code Playgroud)
在此之后,我完全失去了,我正在寻找想法.