小编Eli*_*sky的帖子

如何更改默认的python版本?

我在我的mac中安装了python 3.2.在运行/ Applications/Python 3.2/Update Shell Profile.command之后,令人困惑的是,当我在终端中键入python -V时它说的是Python 2.6.1,如何更改默认的python版本?

python macos

90
推荐指数
8
解决办法
28万
查看次数

有效使用goto进行C中的错误管理?

这个问题实际上是不久前在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

c error-handling exception-handling goto

88
推荐指数
5
解决办法
2万
查看次数

python.array与numpy.array

如果要在Python中创建1d数组,使用NumPy包有什么好处?

python numpy

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

Python的通用优先级队列

我需要在Python代码中使用优先级队列.为了寻找有效的东西,我遇到了堆积.它看起来不错,但似乎只为整数指定.我认为它适用于具有比较运算符的任何对象,但它没有指定它需要哪些比较运算符.

此外,heapq似乎是用Python实现的,所以它并不快.

您是否了解Python中优先级队列的任何快速实现?最理想的情况是,我希望队列是通用的(即适用于具有指定比较运算符的任何对象).

提前致谢

更新:

重新比较heapq,我可以使用(priority, object)查理马丁建议的,或者只是__cmp__为我的对象实现.

我还在寻找比他更快的东西heapq.

python queue

45
推荐指数
6
解决办法
8万
查看次数

支持C99的普遍程度如何?

今天编译器支持的C99标准有多普遍?据我所知,即使GCC完全支持它.这是正确的吗?

C99的哪些功能比其他功能更受支持,即我可以使用哪些功能来确定大多数编译器都能理解我?

c standards-compliance c99

44
推荐指数
4
解决办法
8343
查看次数

按谓词过滤Python列表

我想做的事情如下:

>>> 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的标准库中是否有任何接近这种行为的东西?

我知道在这里滚动你自己很容易,但我正在寻找一种更标准的方式.

python

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

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)

是否有更好/更安全/更惯用的方式来实现相同的结果?

python metaprogramming exec

42
推荐指数
3
解决办法
4万
查看次数

为什么不总是将psyco用于Python代码?

psyco似乎在优化Python代码方面非常有用,它以非侵入性的方式实现.

因此,人们不得不怀疑.假设你总是在x86架构上(这是大多数应用程序运行的地方),为什么不总是使用psyco所有Python代码呢?它有时会出错并破坏程序的正确性吗?增加一些奇怪案例的运行时间?

你有任何负面经历吗?到目前为止,我最负面的经验是它使我的代码速度提高了15%.通常它会更好.

当然,使用psyco并不能替代有效的算法和编码.但是,如果您可以通过两行(导入和调用psyco)的成本来提高代码的性能,我认为没有充分的理由不这样做.

python optimization psyco

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

使用元类的__call__方法而不是__new__?

在讨论元类时,文档说明:

您当然也可以覆盖其他类方法(或添加新方法); 例如__call__(),在调用类时,在元类中定义自定义方法允许自定义行为,例如,并不总是创建新实例.

我的问题是:假设我想在调用类时有自定义行为,例如缓存而不是创建新对象.我可以通过覆盖__new__类的方法来做到这一点.我什么时候想要定义一个元类__call__?这种方法给出了什么,这是不可能实现的__new__

python oop metaclass

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

列出Windows上的串行(COM)端口?

我正在寻找一种强大的方法来列出Windows机器上可用的串行(COM)端口.这篇关于使用WMI帖子,但我想要一些特定于.NET的东西 - 我想在没有.NET的情况下获得Python或C++程序中的端口列表.

我目前知道另外两种方法:

  1. 读取HARDWARE\\DEVICEMAP\\SERIALCOMM注册表项中的信息.这看起来是一个很好的选择,但它是否健壮?我无法在线或在MSDN中找到此注册表单元确实始终包含可用端口的完整列表的保证.

  2. Tryint调用CreateFileCOMN1有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)

c python windows winapi serial-port

29
推荐指数
4
解决办法
5万
查看次数