我在我的mac中安装了python 3.2.在运行/ Applications/Python 3.2/Update Shell Profile.command之后,令人困惑的是,当我在终端中键入python -V时它说的是Python 2.6.1,如何更改默认的python版本?
这个问题实际上是不久前在programming.reddit.com 上进行有趣讨论的结果.它基本归结为以下代码:
int foo(int bar)
{
int return_value = 0;
if (!do_something( bar )) {
goto error_1;
}
if (!init_stuff( bar )) {
goto error_2;
}
if (!prepare_stuff( bar )) {
goto error_3;
}
return_value = do_the_thing( bar );
error_3:
cleanup_3();
error_2:
cleanup_2();
error_1:
cleanup_1();
return return_value;
}
Run Code Online (Sandbox Code Playgroud)
goto这里的使用似乎是最好的方法,导致所有可能性中最干净,最有效的代码,或者至少在我看来.在Code Complete中引用Steve McConnell :
goto在分配资源,对这些资源执行操作,然后释放资源的例程中很有用.使用goto,您可以清理代码的一部分.goto可以降低忘记在检测到错误的每个位置释放资源的可能性.
此方法的另一个支持来自本节中的" Linux设备驱动程序"一书.
你怎么看?这种情况goto在C中是否有效?您是否更喜欢其他方法,这些方法会产生更复杂和/或效率更低的代码,但是要避免goto?
我需要在Python代码中使用优先级队列.为了寻找有效的东西,我遇到了堆积.它看起来不错,但似乎只为整数指定.我认为它适用于具有比较运算符的任何对象,但它没有指定它需要哪些比较运算符.
此外,heapq似乎是用Python实现的,所以它并不快.
您是否了解Python中优先级队列的任何快速实现?最理想的情况是,我希望队列是通用的(即适用于具有指定比较运算符的任何对象).
提前致谢
更新:
重新比较heapq,我可以使用(priority, object)查理马丁建议的,或者只是__cmp__为我的对象实现.
我还在寻找比他更快的东西heapq.
今天编译器支持的C99标准有多普遍?据我所知,即使GCC完全支持它.这是正确的吗?
C99的哪些功能比其他功能更受支持,即我可以使用哪些功能来确定大多数编译器都能理解我?
我想做的事情如下:
>>> lst = [1, 2, 3, 4, 5]
>>> lst.find(lambda x: x % 2 == 0)
2
>>> lst.findall(lambda x: x % 2 == 0)
[2, 4]
Run Code Online (Sandbox Code Playgroud)
在Python的标准库中是否有任何接近这种行为的东西?
我知道在这里滚动你自己很容易,但我正在寻找一种更标准的方式.
我需要在运行时为方法生成代码.能够运行任意代码并拥有文档字符串非常重要.
我想出了一个解决方案相结合exec,并setattr,这里是一个虚拟的例子:
class Viking(object):
def __init__(self):
code = '''
def dynamo(self, arg):
""" dynamo's a dynamic method!
"""
self.weight += 1
return arg * self.weight
'''
self.weight = 50
d = {}
exec code.strip() in d
setattr(self.__class__, 'dynamo', d['dynamo'])
if __name__ == "__main__":
v = Viking()
print v.dynamo(10)
print v.dynamo(10)
print v.dynamo.__doc__
Run Code Online (Sandbox Code Playgroud)
是否有更好/更安全/更惯用的方式来实现相同的结果?
psyco似乎在优化Python代码方面非常有用,它以非侵入性的方式实现.
因此,人们不得不怀疑.假设你总是在x86架构上(这是大多数应用程序运行的地方),为什么不总是使用psyco所有Python代码呢?它有时会出错并破坏程序的正确性吗?增加一些奇怪案例的运行时间?
你有任何负面经历吗?到目前为止,我最负面的经验是它使我的代码速度提高了15%.通常它会更好.
当然,使用psyco并不能替代有效的算法和编码.但是,如果您可以通过两行(导入和调用psyco)的成本来提高代码的性能,我认为没有充分的理由不这样做.
在讨论元类时,文档说明:
您当然也可以覆盖其他类方法(或添加新方法); 例如
__call__(),在调用类时,在元类中定义自定义方法允许自定义行为,例如,并不总是创建新实例.
我的问题是:假设我想在调用类时有自定义行为,例如缓存而不是创建新对象.我可以通过覆盖__new__类的方法来做到这一点.我什么时候想要定义一个元类__call__?这种方法给出了什么,这是不可能实现的__new__?
我正在寻找一种强大的方法来列出Windows机器上可用的串行(COM)端口.这篇关于使用WMI的帖子,但我想要一些特定于.NET的东西 - 我想在没有.NET的情况下获得Python或C++程序中的端口列表.
我目前知道另外两种方法:
读取HARDWARE\\DEVICEMAP\\SERIALCOMM注册表项中的信息.这看起来是一个很好的选择,但它是否健壮?我无法在线或在MSDN中找到此注册表单元确实始终包含可用端口的完整列表的保证.
Tryint调用CreateFile上COMN1有N多家的东西.这还不够好,因为某些COM端口未命名为COMN.例如,创建的一些虚拟COM端口名为CSNA0,CSNB0等,因此我不会依赖此方法.
分享任何其他方法/想法/经验?
编辑:顺便说一句,这是一个从注册表中读取端口名称的简单Python实现:
import _winreg as winreg
import itertools
def enumerate_serial_ports():
""" Uses the Win32 registry to return a iterator of serial
(COM) ports existing on this computer.
"""
path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
except WindowsError:
raise IterationError
for i in itertools.count():
try:
val = winreg.EnumValue(key, i)
yield (str(val[1]), str(val[0]))
except EnvironmentError:
break
Run Code Online (Sandbox Code Playgroud)