小编Jos*_*osh的帖子

为什么我不能在python中处理KeyboardInterrupt?

我正在Windows上编写python 2.6.6代码,如下所示:

try:
    dostuff()
except KeyboardInterrupt:
    print "Interrupted!"
except:
    print "Some other exception?"
finally:
    print "cleaning up...."
    print "done."
Run Code Online (Sandbox Code Playgroud)

dostuff()是一个永远循环的函数,一次从输入流读取一行并对其进行操作.我希望能够在我按下ctrl-c时停止并清理它.

发生的事情是,下面的代码except KeyboardInterrupt:根本没有运行.打印的唯一内容是"清理......",然后打印出如下所示的回溯:

Traceback (most recent call last):
  File "filename.py", line 119, in <module>
    print 'cleaning up...'
KeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)

因此,异常处理代码没有运行,并且traceback声称在finally子句期间发生了KeyboardInterrupt ,这没有意义,因为命中ctrl-c是导致该部分首先运行的原因!甚至通用except:子句也没有运行.

编辑:基于注释,我try:用sys.stdin.read()替换了块的内容.问题仍然与描述完全一致,finally:块的第一行运行,然后打印相同的回溯.

编辑#2: 如果我在阅读后添加了很多东西,那么处理程序就可以了.所以,这失败了:

try:
    sys.stdin.read()
except KeyboardInterrupt:
    ...
Run Code Online (Sandbox Code Playgroud)

但这有效:

try:
    sys.stdin.read()
    print "Done reading."
except KeyboardInterrupt:
    ...
Run Code Online (Sandbox Code Playgroud)

这是打印的内容:

Done reading. Interrupted!
cleaning up...
done.
Run Code Online (Sandbox Code Playgroud)

因此,出于某种原因,"完成阅读".即使前一行发生异常,也会打印行.这不是一个真正的问题 - 显然我必须能够在"try"块内的任何地方处理异常.但是,打印不能正常工作 - 它不会像之前那样打印换行符!"Interruped"印在同一条线上......前面有一个空格,出于某种原因......?无论如何,在那之后代码完成它应该做的事情. …

python windows keyboardinterrupt

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

我可以在与pyodbc和MS SQL Server的一个连接上使用多个游标吗?

我在python 2.6上使用pyodbc连接到Microsoft SQL Server 2005.我打开一个连接,创建几个游标:

c1 = connection.cursor()
c2 = connection.cursor()
Run Code Online (Sandbox Code Playgroud)

然后对第一个游标运行查询.

c1.execute("select * from foo")
Run Code Online (Sandbox Code Playgroud)

现在我在第二个游标上运行一个查询:

c2.execute("select * from bar")
Run Code Online (Sandbox Code Playgroud)

...我收到一个错误:"连接忙于另一个hstmt的结果."

我做了之后c1.fetchall()或者c1.close()我可以使用c2.

我的问题是:为什么我甚至被允许在连接上创建多个游标,如果我只允许一次使用一个游标,并且同一个游标总是可以重用?并且,如果我想为另一个查询的结果的每一行运行查询,如下所示:

for x in c1.execute(...):
    for y in c2.execute(...):
Run Code Online (Sandbox Code Playgroud)

我真的必须创建到同一数据库的多个连接?

python sql-server pyodbc

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

“执行此操作或引发错误”的简洁语法

javascript 和其他类似 c 的语言的一个常见习惯用法是使用逻辑“或”运算符,如下所示:

function f(x) {
    return (foo(x) || -1);
}
Run Code Online (Sandbox Code Playgroud)

如果 foo(x) 返回 null(或零,或空字符串),则返回 -1。

如果我不想返回不同的值,而是想抛出错误怎么办?throw是一个关键字,而不是一个函数,所以它不能用在 的右侧||。基本上我想这样做:

function foo(x) {
    result = bar(x);
    if(result) {return result;}
    throw "bar(x) didn't return a value";
}
Run Code Online (Sandbox Code Playgroud)

可以变得更简洁(并且更少冗余)吗?

javascript

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

在Windows 10上,npm非常慢

这个问题基本上是重复的这一个,除了对这个问题进行接受的答案是,"这不是真正慢,你只是没有正确运行定时指令."

就我而言,它实际上更慢!:)

我在Windows 10上.这是PowerShell的Measure-Command的输出(TotalMilliseconds行表示挂钟时间):

PS> Measure-Command {npm --version}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 1
Milliseconds      : 481
Ticks             : 14815261
TotalDays         : 1.71472928240741E-05
TotalHours        : 0.000411535027777778
TotalMinutes      : 0.0246921016666667
TotalSeconds      : 1.4815261
TotalMilliseconds : 1481.5261
Run Code Online (Sandbox Code Playgroud)

其他一些数字,供比较:

  • '{.\node_modules.bin\mocha}':1300ms
  • 'npm run test'(只运行摩卡):3300ms
  • npm help:1900ms.
  • 节点解释器本身就可以了node -e 0:180ms

这不仅仅是npm慢...... mocha报告说我的测试只需要42ms,但正如你上面所看到的,摩卡需要1300ms来运行这42ms的测试!

windows node.js npm

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

使用 ES6 `Proxy` 和 `with` 真的安全吗?

众所周知,Javascript 的eval关键字和Function从字符串创建的对象都不应出于任何原因用于运行不受信任的代码。

然而,我想知道 ES6 代理是否会改变这一点。考虑:

let env = {eval: eval};
let proxy = new Proxy(env, { has: () => true });
with(proxy) {eval('...')}
Run Code Online (Sandbox Code Playgroud)

代理对象假装拥有所有可能的属性,这意味着它会阻止更高范围的搜索。在该with块内,任何未在 上设置的属性env都会出现undefined,而在 with 块内设置的任何全局属性实际上都会在 上设置env

这似乎让我可以为ed代码运行建立一个完全受控和隔离的环境eval。有什么风险?

以下是我看到的一些担忧:

  1. 不要将任何引用window、或document、或localStorage或任何其他敏感内容放入 中env
  2. 不要放入任何可变对象,env除非您同意不受信任的代码改变它。
    • 解决方案:如有必要,进行深复制。
  3. 块内的代码with无法访问块外的任何内容。如果需要诸如MathObject、 或 之类的东西String,则必须将它们放入env- 这意味着这些可以被恶意代码修改。即使是eval上面我的最小示例中的函数也可以修改。
    • 解决方案:为这些对象创建代理,将对特定属性的只读访问权限列入白名单。

只要遵循这些准则,这真的安全吗?还有其他问题吗?

javascript security eval

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

Clang抱怨:"指针由一个临时数组初始化"

我有一个(指向)不同长度的数组的数组,我学会了我可以使用复合文字定义:

const uint8_t *const minutes[] = {
    (const uint8_t[]) {END},
    (const uint8_t[]) {1, 2, 3, 4, 5 END},
    (const uint8_t[]) {8, 9, END},
    (const uint8_t[]) {10, 11, 12, END},
    ...
}; 
Run Code Online (Sandbox Code Playgroud)

gcc接受这个很好,但是clang说:pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression.这是什么意思?代码似乎正在起作用,但是当它们指向不再分配的内存时,很多东西似乎都有效.这是我需要担心的吗?(最终我只需要它与gcc一起工作.)

更新:有些可疑的事情正在发生.它在这里说:

复合文字产生左值.这意味着您可以获取复合文字的地址,该复合文字是复合文字声明的未命名对象的地址.只要复合文字没有const限定类型,就可以使用指针来修改它.

   `struct POINT *p;
   p = &(struct POINT) {1, 1};
Run Code Online (Sandbox Code Playgroud)

这个示例代码似乎正在完成我正在尝试做的事情:指向由复合文字定义的内容的指针.clang错误消息合法吗?当用clang或gcc编译时,这最终会指向未分配的内存吗?

更新2:找到一些文档:"在C中,复合文字指定一个具有静态或自动存储持续时间的未命名对象.在C++中,复合文字指定一个临时对象,它只存在于其完整表达式的末尾. "所以似乎clang是正确的警告这个,gcc可能也应该,但是,即使有-Wall -Wextra.

我无法猜测为什么从C++中删除了有用的C功能,并且没有提供完成相同功能的优雅替代方法.

c++ allocation clang

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

如何在Haskell中实现通用的"zipn"和"unzipn"?

我在基本的Haskell库中找到了这个文档:

zip :: [a] -> [b] -> [(a, b)]
    zip takes two lists and returns a list of corresponding pairs. If one input list is short, excess elements of the longer list are discarded.

zip3 :: [a] -> [b] -> [c] -> [(a, b, c)]
    zip3 takes three lists and returns a list of triples, analogous to zip.

zip4 :: [a] -> [b] -> [c] -> [d] -> [(a, b, c, d)]
    The zip4 function takes four lists and returns …
Run Code Online (Sandbox Code Playgroud)

haskell

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

在哪里使用 Redux 处理计算属性?

在使用 Redux 时,store 应该是唯一的事实来源,并且没有冗余。假设商店的一部分代表有姓名和年龄的人。传统面向对象编程中的 person 类可能如下所示:

class Person {
    constructor(first, last, birthday) {
        this.first = first;
        this.last = last;
        this.birthday = birthday;
    get_fullname() { // ... //}
    get_age() { // ... //}
}
Run Code Online (Sandbox Code Playgroud)

但是,Redux 存储中的对象上不允许使用方法。那么,这些“方法”应该在哪里实施呢?

javascript redux

4
推荐指数
2
解决办法
3048
查看次数

SVG路径操纵

Inkscape SVG编辑器内置了一些整洁的路径操作工具。我特别想以编程方式访问的一个是offset函数,它(试图)创建了一条与现有路径有固定距离的路径,如下图所示(黑线)是红线的偏移量):

路径偏移

我希望能够从Python程序执行此操作。

Inkscape具有基本的脚本支持,但它基本上仅由调用非交互式菜单命令组成-例如,您可以创建一个从现有路径插入或插入的路径,但只能精确地设置1px或10px,而不是用户指定的路径量。因此,这里似乎没有用。

是否有一个库或其他工具可用来在Python中进行这些路径转换(理想情况下是转换为SVG文件)?

python svg vector-graphics

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

在Flow中对子内置类型进行子类型化

假设我正在编写处理UUID的代码.在内部,我想将它们表示为字符串.也就是说,每个UUID都是一个字符串,但不是每个字符串都是有效的UUID,我不想意外地将错误的东西分配给一个用于保存UUID的变量.所以我想创建一个类型'uuid',这样这个赋值就会失败:

let foo: uuid = "Some string"
Run Code Online (Sandbox Code Playgroud)

但这应该成功:

function create_uuid(): uuid; { /* implementation? */ }
let foo: uuid = create_uuid(); 
let bar: string = uuid;  // this is fine
Run Code Online (Sandbox Code Playgroud)

有没有办法用Flow创建具有这些属性的类型?我$Subtype在研究中发现,并认为这可能有效:

type uuid = $Subtype<string>;
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,它仍然允许从字符串赋值.

javascript flowtype

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