在Python中,可以创建一个没有显式返回的过程.即:
def test(val):
if 0 == val:
return 8
Run Code Online (Sandbox Code Playgroud)
此外,可以将该函数的结果分配给变量:
>>> a = test(7)
>>> print `a`
'None'
Run Code Online (Sandbox Code Playgroud)
为什么这样呢?令人困惑的设计决策背后是什么语言逻辑?为什么不简单地引发编译错误?
编辑:是的,我意识到它的工作原理.谢谢.我的问题是为什么?在您的代码中引入细微错误似乎是一种可靠的火灾方式.正如下面e-satisf所提到的那样,似乎违背了"明显更善于隐含"这一非常明智的蟒蛇格言.
那么,这有什么用呢?它只是一个设计监督或一个简化的假设或一个经过慎重考虑的决定吗?
编辑:大家都同意用这种方式表达意图要好得多:
def test(val):
if 0 == val:
return 8
else:
return None
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么Python更喜欢前一种风格来引发编译时异常?
编辑:S.Lott明确地提出了这一点(其他人也这样做,他似乎对我来说最清楚)这种行为是因为Python是一种动态语言,因此无法在编译时检查,系统的运行时行为.
由于程序(那些不返回值的函数)和函数(那些没有返回值)之间没有区别,因此在编译时没有任何内容可以强制执行.这意味着当我们遇到运行时行为时,我们要么在某些情况下发生灾难性故障(我们抛出异常),要么我们默默地假设程序员知道他们在做什么并理解默认行为.
pythonic方式是做后者,C风格的方式是做前者.
这似乎是有道理的,因为这是一个很好的理由.
S.Lott明确的理由被埋没在对已接受答案的评论中,所以我认为最好在这里总结一下.
我会暂时接受答案,看看S.Lott是否正式回答.否则,我会给SilentGhost点.
我有一个简单的CentOS node.js服务器,它应该使用高频UDP消息,然后将它们转发给另一个服务.
麻烦的是dgram.send在每次调用时都会进行DNS查找.这种DNS查找既减慢了消息的处理速度,又偶尔让DNS服务器将node.js主机服务器列入黑名单,认为它正在获得DOS.
问题是:如何在node.js中发送UDP数据包而不会导致DNS查找?
谢谢你的时间.
我试图在引发异常后覆盖Python中Exception子类的打印输出,并且我没有运气实际调用我的覆盖.
def str_override(self):
"""
Override the output with a fixed string
"""
return "Override!"
def reraise(exception):
"""
Re-raise an exception and override its output
"""
exception.__str__ = types.MethodType(str_override, exception, type(exception))
# Re-raise and remove ourselves from the stack trace.
raise exception, None, sys.exc_info()[-1]
def test():
"""
Should output "Override!" Actually outputs "Bah Humbug"
"""
try:
try:
raise Exception("Bah Humbug")
except Exception, e:
reraise(e, "Said Scrooge")
except Exception, e:
print e
Run Code Online (Sandbox Code Playgroud)
知道为什么这实际上没有覆盖str方法吗?反思实例变量表明该方法实际上已被方法覆盖,但它就像Python一样拒绝通过print调用它.
我在这里错过了什么?
知道为什么这在MySQL 5.1中失败了:
SET @LOAD_TIME = UNIX_TIMESTAMP();
SET @OUTFILE = CONCAT(CONCAT('/tmp/outfile_', @LOAD_TIME), '.sql');
SELECT *
FROM `tableA`
INTO OUTFILE @OUTFILE;
Run Code Online (Sandbox Code Playgroud)
它是MySQL的SELECT的限制还是我在这里遗漏了什么?