小编Set*_*son的帖子

何时使用"属性"内置:辅助功能和生成器

我最近发现了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)

python properties

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

使用#ifdef检测编译器

我正在尝试构建一个适用于多个平台和编译器的小代码.我使用断言,其中大部分可以被关闭,但与PGI的编译时pgicpp使用-mp了支持OpenMP,它会自动使用该--no_exceptions选项:无处不在我的代码以"扔"语句生成一个致命编译器错误.("禁用异常处理支持")

有没有define我可以测试的宏来隐藏throwPGI上的语句?我经常使用gcc,有GCC_VERSION等等.我在PGI中找不到任何描述这些宏的文档.

c++ exception pgi c-preprocessor

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

Vim:从鼠标过渡到移动

我经常使用MacVim(和gvim).我熟悉并使用了很多基本的移动命令(的b,w,$,0,G).然而,对于很多事情 - 例如在屏幕上选择特定线条或跳到不同线路中的特定列 - 我使用鼠标(有时与我的左手在键盘上一致).它还有助于我的鼠标有一个滚轮和更改标签的按钮.

我还需要承认......我使用键盘上的箭头键而不是hjkl.

我认为通过不必从插入模式中逃脱,以及将双手放在键盘的主要部分上,我的速度(以及计算机的姿势)将得到改善.

是什么让你放弃了鼠标?在行和列之间快速移动,滚动等最有用的快捷方式是什么?

这个问题的灵感来自最近这篇文章

vim mouse

6
推荐指数
2
解决办法
1126
查看次数

在mac上修改/创建/访问时间不一致

我无法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?timeos.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)

python macos touch stat

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

dynamic_cast问题:typeid对象不相等,但名称相等

我发现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)

c++ dynamic-cast typeid

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

在Python中实时拦截来自另一个进程的stdout

我想运行一个系统进程,拦截输出,并在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)

python perl process

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

MPI信号处理

使用时mpirun,是否可以^C在正在运行的代码中捕获信号(例如,由生成的SIGINT )?

例如,我正在运行并行化的python代码。except KeyboardInterruptpython blah.py我自己运行时,我可以捕获那些错误,但是当我运行时,则无法捕获mpirun -np 1 python blah.py

有人有建议吗?甚至找到如何在C或C ++编译程序中捕获信号也将是一个有用的开始。

如果我向生成的Python进程发送信号,它们可以正确处理这些信号;但是,发送到父orterun进程的信号(即,由于超过了群集上的墙时间,或在终端上按了Control-C)将立即杀死所有内容。

python signals mpi

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

将C/C++向量快速转换为Numpy数组

我正在使用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开销访问或复制的数据?

c++ python arrays swig numpy

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

如何在 gvim 中重新映射 control-shift-leftmouse?

我想在 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>同样没有响应,大多数其他修改后的点击也是如此。

我怎样才能真正重新映射修改后的鼠标点击?

mapping vim macvim

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

返回std :: pair与非const引用的传递

为什么返回std::pairboost::tuple要少得多效率比参考返回?在我测试的实际代码中,通过非const引用而不是std::pair在内核中设置数据可以将代码加速20%.

作为一个实验,我查看了三个最简单的情况,包括将两个(预定义的)整数添加到两个整数:

  1. 使用内部内联函数通过引用修改整数

  2. 使用两个内部内联函数按值返回整数

  3. 使用内部内联函数返回复制到结果的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)

c++ optimization assembly

3
推荐指数
2
解决办法
2872
查看次数

matplotlib:使用标记时的丑陋情节

我有一点问题.我有一个程序,它将为潜力绘制波函数,当我使用绘图中的选项(使用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 matplotlib

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

python全局变量__name__(一个新手问题)

我第一次启动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)

python

3
推荐指数
2
解决办法
1275
查看次数

尝试递归地实现幂和阶乘函数.C++

到目前为止,我所有的定义都是定义.

double power(double base, int exponent);

double factorial(double n);
Run Code Online (Sandbox Code Playgroud)

在此之后,我完全失去了,我正在寻找想法.

c++ function

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