在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程序创建一个非常简单的基于HTML/AJAX的GUI.所以前端是一个HTML页面,它通过AJAX与程序通信.你能用python给我一个服务器端的最小实现SimpleHTTPServer.SimpleHTTPRequestHandler
吗?
一个简单的例子是文本字段和按钮.当按下按钮时,字段的内容被发送到服务器,然后服务器发回相应的答案.我知道在Python中有很多强大的解决方案,但我想保持这个非常简单.我已经为这样的服务器找到了一些很好的例子(例如这里),但到目前为止我还没有找到真正最小的服务器.
如果你想知道我为什么要以这种方式实现GUI:我对这个应用程序的关注是在很好的布局中显示大量数据,只需要很少的交互 - 所以使用HTML + CSS似乎最方便(我已经用它来进行非交互式数据显示).
当你挑选一个具有一些无法腌制的属性的对象时,它将失败,并出现如下通用错误消息:
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 …
当通过多处理模块执行的函数内部存在异常时,我想知道获得堆栈跟踪的最佳方法.这是一个例子:
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科学库(这是目标区域)中发生了很多改进.例如,numpy项目已经做了很大的努力来改进文档字符串.人们仍然可以争论是否有可能从一开始就不断解决这些问题.
我有这个有点异议的问题:为什么这么多Python库有杂乱的代码而不遵循标准的最佳实践?或者你认为这种观察绝对不是真的吗?情况与其他语言相比如何?我对你的看法很感兴趣.
我认为质量缺乏的一些原因:
即使对于公共API,文档字符串也经常完全缺失或不完整.当一个方法采用*args
并且**kwargs
没有记录可以给出哪些值时,这很痛苦.
糟糕的Python编码实践,比如添加新的属性__init__
.这样的事情使得代码难以阅读(或维护).
几乎没有任何库遵循PEP8编码约定.有时,约定在单个文件中甚至不一致.
整体设计很乱,没有明确的API.似乎没有进行足够的重构.
单位测试覆盖率差.
不要误会我的意思,我非常喜欢Python及其生态系统.即使我在这些图书馆中挣扎,他们通常也会完成工作,我很感激.但我也认为,由于这些问题,最终浪费了大量的开发人员时间.也许这是因为Python为您提供了如此多的自由,以至于编写糟糕的代码非常容易.
在Python中,使用属性而不是Java样式的getter,setter.所以人们很少在类的公共接口中看到get ...或set ..方法.
但是在一个属性不合适的情况下,人们可能仍然会得到像getter或setter一样的方法.现在我的问题:这些方法名称应该以get_
/ 开头set_
吗?或者是这种单声道的冗长,因为它通常很明显是什么意思(并且仍然可以使用文档字符串来澄清非显而易见的情况)?
这可能是个人品味的问题,但我会对大多数人对此有何看法感兴趣?作为API用户,您更喜欢什么?
示例:假设我们有一个表示多个城市的对象.一个人可能有一个方法,get_city_by_postalcode(postalcode)
或者可以使用较短的名称city_by_postalcode
.我倾向于后者.
在Python中,iterable的接口是迭代器接口的子集.这具有的优点是,在许多情况下,它们可以以相同的方式处理.但是,两者之间存在重要的语义差异,因为对于iterable,__iter__
返回一个新的迭代器对象而不仅仅是self
.我怎样才能测试一个iterable真的是一个可迭代的而不是一个迭代器?从概念上讲,我理解iterables是集合,而迭代器只管理迭代(即跟踪位置)但不是集合本身.
当想要多次循环时,差异是重要的.如果给出了迭代器,则第二个循环将不起作用,因为迭代器已经用完并直接引发StopIteration
.
测试一种next
方法很有吸引力,但这看起来很危险而且有些不对.我应该检查第二个循环是否为空?
有没有办法以更加pythonic的方式进行这样的测试?我知道这听起来像是针对EAFP的LBYL的经典案例,所以也许我应该放弃?或者我错过了什么?
编辑: S.Lott在下面的回答中说,这主要是想要在迭代器上进行多次传递的问题,并且首先不应该这样做.但是,在我的情况下,数据非常大,并且根据情况必须多次传递以进行数据处理(绝对没有办法解决这个问题).
迭代也由用户提供,并且对于单次传递足够的情况,它将与迭代器一起工作(例如,为了简单起见,由生成器创建).但是,如果用户在需要多次传递时只提供迭代器,那么防止这种情况会很好.
编辑2:
实际上这是一个非常好的抽象基类的例子.将__iter__
在迭代器和迭代方法具有相同的名称,但语义上是不同的!所以hasattr
没用,但isinstance
提供了一个干净的解决方案.
我正在一个最近切换到py.test unittest框架的项目中工作.我习惯于从Eclipse调用我的测试,以便我可以使用调试器(例如,放置断点来分析测试失败的发展方式).现在这已经不可能了,因为运行测试的唯一方法是通过命令行blackbox.
有没有办法在Python中使用py.test,以便不会强行退出IDE?当然,测试不应该在单独的过程中运行.
在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)
当然我只会在类赋值明确/唯一的情况下使用它(在我的情况下,将类添加到类的整个过程是自动化的,所以添加这样的行很简单).
我无法理解classmethod对象在Python中是如何工作的,特别是在元类和in的上下文中__new__
.在我的特殊情况下,我想得到一个classmethod成员的名字,当我迭代通过members
给予的__new__
.
对于普通方法,名称只是存储在__name__
属性中,但对于类方法,显然没有这样的属性.我甚至没有看到如何调用classmethod,因为也没有__call__
属性.
有人可以向我解释一下类方法是如何工作的,还是指向一些文档?谷歌搜索引导我无处可去.谢谢!
python ×10
ajax ×1
class-method ×1
coding-style ×1
conventions ×1
iterator ×1
metaclass ×1
numpy ×1
pytest ×1
python-3.x ×1
super ×1