小编nik*_*kow的帖子

Numpy:我应该使用newaxis还是None?

在numpy中,可以在切片语法中使用'newaxis'对象来创建长度为1的轴,例如:

import numpy as np
print np.zeros((3,5))[:,np.newaxis,:].shape
# shape will be (3,1,5)
Run Code Online (Sandbox Code Playgroud)

文件指出一个也可以用None代替newaxis,效果是完全一样的.

有没有理由选择一个而不是另一个?是否有任何一般偏好或风格指南?我的印象是newaxis更受欢迎,可能是因为它更明确.那么有什么理由None被允许吗?

python numpy

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

如何在Python中实现AJAX的最小服务器?

我想为Python程序创建一个非常简单的基于HTML/AJAX的GUI.所以前端是一个HTML页面,它通过AJAX与程序通信.你能用python给我一个服务器端的最小实现SimpleHTTPServer.SimpleHTTPRequestHandler吗?

一个简单的例子是文本字段和按钮.当按下按钮时,字段的内容被发送到服务器,然后服务器发回相应的答案.我知道在Python中有很多强大的解决方案,但我想保持这个非常简单.我已经为这样的服务器找到了一些很好的例子(例如这里),但到目前为止我还没有找到真正最小的服务器.

如果你想知道我为什么要以这种方式实现GUI:我对这个应用程序的关注是在很好的布局中显示大量数据,只需要很少的交互 - 所以使用HTML + CSS似乎最方便(我已经用它来进行非交互式数据显示).

python ajax user-interface

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

如何判断哪个对象属性pickle失败?

当你挑选一个具有一些无法腌制的属性的对象时,它将失败,并出现如下通用错误消息:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉哪个属性导致异常?我使用的是Python 2.5.2.

即使我原则上理解问题的根本原因(例如在上面的例子中有一个实例方法),但仍然很难准确地指出它.在我的情况下,我已经定义了一个自定义__getstate__方法,但忘记了一个关键属性.这发生在嵌套对象的复杂结构中,因此我花了一些时间来识别坏属性.

根据要求,这里有一个简单的例子是pickle故意失败:

import cPickle as pickle
import new

class Test(object):
    pass

def test_func(self):
    pass

test = Test()
pickle.dumps(test)
print "now with instancemethod..."
test.test_meth = new.instancemethod(test_func, test)
pickle.dumps(test)
Run Code Online (Sandbox Code Playgroud)

这是输出:

now with instancemethod...
Traceback (most recent call last):
  File "/home/wilbert/develop/workspace/Playground/src/misc/picklefail.py", line 15, in <module>
    pickle.dumps(test)
  File "/home/wilbert/lib/python2.5/copy_reg.py", line 69, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle instancemethod objects
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有提示该属性test_meth …

python serialization

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

使用多处理时获取堆栈跟踪的最佳方法是什么?

当通过多处理模块执行的函数内部存在异常时,我想知道获得堆栈跟踪的最佳方法.这是一个例子:

import multiprocessing

def square(x):
    raise Exception("Crash.")
    return x**2

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    results = pool.map_async(square, range(5))
    for result in results.get():
        print result
Run Code Online (Sandbox Code Playgroud)

这打印:

Traceback (most recent call last):
  File "/extra/workspace/Playground/src/multiproc/multiproc_debug.py", line 11, in <module>
    for result in results.get():
  File "/extra/Python 2.6/lib/python2.6/multiprocessing/pool.py", line 422, in get
    raise self._value
Exception: Crash.
Run Code Online (Sandbox Code Playgroud)

所以没有有用的堆栈跟踪,这非常烦人.我目前的解决方案:

import multiprocessing
import traceback

def square(x):
    try:
        # some more code...
        raise Exception("Crash.")
    except Exception, exception:
        print exception
        traceback.print_exc()
        raise
    return x**2
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有所有样板代码的情况下获得此行为?如果没有,不包括此功能的原因是什么?

编辑:可以使用装饰器作为样板代码,但我不知道这样的装饰器是否包含在标准库中?

python multiprocessing

17
推荐指数
1
解决办法
2200
查看次数

许多Python库的代码质量相对较低吗?

编辑:由于这个问题被要求在标准Python科学库(这是目标区域)中发生了很多改进.例如,numpy项目已经做了很大的努力来改进文档字符串.人们仍然可以争论是否有可能从一开始就不断解决这些问题.


我有这个有点异议的问题:为什么这么多Python库有杂乱的代码而不遵循标准的最佳实践?或者你认为这种观察绝对不是真的吗?情况与其他语言相比如何?我对你的看法很感兴趣.

我认为质量缺乏的一些原因:

  • 即使对于公共API,文档字符串也经常完全缺失或不完整.当一个方法采用*args并且**kwargs没有记录可以给出哪些值时,这很痛苦.

  • 糟糕的Python编码实践,比如添加新的属性__init__.这样的事情使得代码难以阅读(或维护).

  • 几乎没有任何库遵循PEP8编码约定.有时,约定在单个文件中甚至不一致.

  • 整体设计很乱,没有明确的API.似乎没有进行足够的重构.

  • 单位测试覆盖率差.

不要误会我的意思,我非常喜欢Python及其生态系统.即使我在这些图书馆中挣扎,他们通常也会完成工作,我很感激.但我也认为,由于这些问题,最终浪费了大量的开发人员时间.也许这是因为Python为您提供了如此多的自由,以至于编写糟糕的代码非常容易.

python conventions

15
推荐指数
9
解决办法
2257
查看次数

我应该在Python方法名称中使用get_/set_前缀吗?

在Python中,使用属性而不是Java样式的getter,setter.所以人们很少在类的公共接口中看到get ...或set ..方法.

但是在一个属性不合适的情况下,人们可能仍然会得到像getter或setter一样的方法.现在我的问题:这些方法名称应该以get_/ 开头set_吗?或者是这种单声道的冗长,因为它通常很明显是什么意思(并且仍然可以使用文档字符串来澄清非显而易见的情况)?

这可能是个人品味的问题,但我会对大多数人对此有何看法感兴趣?作为API用户,您更喜欢什么?

示例:假设我们有一个表示多个城市的对象.一个人可能有一个方法,get_city_by_postalcode(postalcode)或者可以使用较短的名称city_by_postalcode.我倾向于后者.

python coding-style

14
推荐指数
2
解决办法
2706
查看次数

如何区分迭代器和迭代?

在Python中,iterable的接口是迭代器接口的子集.这具有的优点是,在许多情况下,它们可以以相同的方式处理.但是,两者之间存在重要的语义差异,因为对于iterable,__iter__返回一个新的迭代器对象而不仅仅是self.我怎样才能测试一个iterable真的是一个可迭代的而不是一个迭代器?从概念上讲,我理解iterables是集合,而迭代器只管理迭代(即跟踪位置)但不是集合本身.

当想要多次循环时,差异是重要的.如果给出了迭代器,则第二个循环将不起作用,因为迭代器已经用完并直接引发StopIteration.

测试一种next方法很有吸引力,但这看起来很危险而且有些不对.我应该检查第二个循环是否为空?

有没有办法以更加pythonic的方式进行这样的测试?我知道这听起来像是针对EAFP的LBYL的经典案例,所以也许我应该放弃?或者我错过了什么?

编辑: S.Lott在下面的回答中说,这主要是想要在迭代器上进行多次传递的问题,并且首先不应该这样做.但是,在我的情况下,数据非常大,并且根据情况必须多次传递以进行数据处理(绝对没有办法解决这个问题).

迭代也由用户提供,并且对于单次传递足够的情况,它将与迭代器一起工作(例如,为了简单起见,由生成器创建).但是,如果用户在需要多次传递时只提供迭代器,那么防止这种情况会很好.

编辑2: 实际上这是一个非常好的抽象基类的例子.将__iter__在迭代器和迭代方法具有相同的名称,但语义上是不同的!所以hasattr没用,但isinstance提供了一个干净的解决方案.

python iterator

14
推荐指数
1
解决办法
4558
查看次数

如何从Python使用py.test?

我正在一个最近切换到py.test unittest框架的项目中工作.我习惯于从Eclipse调用我的测试,以便我可以使用调试器(例如,放置断点来分析测试失败的发展方式).现在这已经不可能了,因为运行测试的唯一方法是通过命令行blackbox.

有没有办法在Python中使用py.test,以便不会强行退出IDE?当然,测试不应该在单独的过程中运行.

python pytest

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

如何通过手动填充__class__单元格来使super()工作?

在Python 3中,可以使用super()而不是super(MyClass, self),但这仅适用于在类中定义的方法.如Michele Simionato的文章所述,以下示例不起作用:

def __init__(self):
    print('calling __init__')
    super().__init__()

class C(object):
    __init__ = __init__

if __name__ == '__main__':
    c = C()
Run Code Online (Sandbox Code Playgroud)

它失败是因为super()查找了一个在这种情况下未定义的__class__ 单元格.

是否可以在定义功能后手动设置此单元格,还是不可能?

不幸的是,我不明白细胞是如何在这种情况下工作的(没有找到很多文档).我希望有类似的东西

__init__.__class_cell_thingy__ = C
Run Code Online (Sandbox Code Playgroud)

当然我只会在类赋值明确/唯一的情况下使用它(在我的情况下,将类添加到类的整个过程是自动化的,所以添加这样的行很简单).

python metaprogramming super python-3.x

10
推荐指数
1
解决办法
2135
查看次数

classmethod对象如何工作?

我无法理解classmethod对象在Python中是如何工作的,特别是在元类和in的上下文中__new__.在我的特殊情况下,我想得到一个classmethod成员的名字,当我迭代通过members给予的__new__.

对于普通方法,名称只是存储在__name__属性中,但对于类方法,显然没有这样的属性.我甚至没有看到如何调用classmethod,因为也没有__call__属性.

有人可以向我解释一下类方法是如何工作的,还是指向一些文档?谷歌搜索引导我无处可去.谢谢!

python metaclass class-method

8
推荐指数
1
解决办法
2871
查看次数