我正在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 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)
我真的必须创建到同一数据库的多个连接?
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)
可以变得更简洁(并且更少冗余)吗?
这个问题基本上是重复的这一个,除了对这个问题进行接受的答案是,"这不是真正慢,你只是没有正确运行定时指令."
就我而言,它实际上更慢!:)
我在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)
其他一些数字,供比较:
npm help
:1900ms.node -e 0
:180ms这不仅仅是npm慢...... mocha报告说我的测试只需要42ms,但正如你上面所看到的,摩卡需要1300ms来运行这42ms的测试!
众所周知,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
。有什么风险?
以下是我看到的一些担忧:
window
、或document
、或localStorage
或任何其他敏感内容放入 中env
。env
除非您同意不受信任的代码改变它。
with
无法访问块外的任何内容。如果需要诸如Math
、Object
、 或 之类的东西String
,则必须将它们放入env
- 这意味着这些可以被恶意代码修改。即使是eval
上面我的最小示例中的函数也可以修改。
只要遵循这些准则,这真的安全吗?还有其他问题吗?
我有一个(指向)不同长度的数组的数组,我学会了我可以使用复合文字定义:
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限定类型,就可以使用指针来修改它.
Run Code Online (Sandbox Code Playgroud)`struct POINT *p; p = &(struct POINT) {1, 1};
这个示例代码似乎正在完成我正在尝试做的事情:指向由复合文字定义的内容的指针.clang错误消息合法吗?当用clang或gcc编译时,这最终会指向未分配的内存吗?
更新2:找到一些文档:"在C中,复合文字指定一个具有静态或自动存储持续时间的未命名对象.在C++中,复合文字指定一个临时对象,它只存在于其完整表达式的末尾. "所以似乎clang是正确的警告这个,gcc可能也应该,但是,即使有-Wall -Wextra
.
我无法猜测为什么从C++中删除了有用的C功能,并且没有提供完成相同功能的优雅替代方法.
我在基本的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) 在使用 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 存储中的对象上不允许使用方法。那么,这些“方法”应该在哪里实施呢?
Inkscape SVG编辑器内置了一些整洁的路径操作工具。我特别想以编程方式访问的一个是offset函数,它(试图)创建了一条与现有路径有固定距离的路径,如下图所示(黑线)是红线的偏移量):
我希望能够从Python程序执行此操作。
Inkscape具有基本的脚本支持,但它基本上仅由调用非交互式菜单命令组成-例如,您可以创建一个从现有路径插入或插入的路径,但只能精确地设置1px或10px,而不是用户指定的路径量。因此,这里似乎没有用。
是否有一个库或其他工具可用来在Python中进行这些路径转换(理想情况下是转换为SVG文件)?
假设我正在编写处理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)
但由于某种原因,它仍然允许从字符串赋值.