我很想知道下面的代码是如何工作的.它来自http://docs.python.org/library/itertools.html#itertools.izip_longest,并且是izip_longest迭代器的纯python等价物.我对哨兵功能特别神秘,它是如何工作的?
def izip_longest(*args, **kwds):
# izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
fillvalue = kwds.get('fillvalue')
def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
yield counter() # yields the fillvalue, or raises IndexError
fillers = repeat(fillvalue)
iters = [chain(it, sentinel(), fillers) for it in args]
try:
for tup in izip(*iters):
yield tup
except IndexError:
pass
Run Code Online (Sandbox Code Playgroud) 我理解是什么__new__(以及它与之有什么不同__init__)所以我对定义不感兴趣,我对何时以及如何使用感兴趣__new__.
文件说:
在一般情况下,你不应该需要重写
__new__,除非你继承一个不变型像str,int,unicode或tuple
但我无法想到使用其他情况__new__或如何正确使用它(例如,当子类化不可变类型或为什么在这种情况下需要它时).
那么,何时,为什么以及如何使用__new__?
我对用例很感兴趣,而不是它的用途(我知道它的作用).
我希望下面的脚本最多打印一个事件然后停止(它的编写只是为了说明问题).
#!/usr/bin/env python
from select import poll, POLLIN
filename = "test.tmp"
# make sure file exists
open(filename, "a").close()
file = open(filename, "r+")
p = poll()
p.register(file.fileno(), POLLIN)
while True:
events = p.poll(100)
for e in events:
print e
# Read data, so that the event goes away?
file.read()
Run Code Online (Sandbox Code Playgroud)
但是,它每秒打印约70000个事件.为什么?
我写了一个内部使用pyudev.Monitor类的类.除此之外,它还使用poll对象轮询 fileno()方法提供的fileno以进行更改.
现在我正在尝试为我的班级编写单元测试(我意识到我应该首先编写单元测试,所以不需要指出它),因此我需要为自己编写自己的fileno()方法模拟pyudev.Monitor对象,我需要控制它,以便我可以触发poll对象来报告事件.正如上面的代码所示,我无法停止报告看似不存在的事件!
我可以在民意调查类中找不到acknowledge_event()或类似内容,以使事件消失(我怀疑只有一个事件在某种程度上被卡住),搜索谷歌并且这个网站什么都没有产生.我在Ubuntu 10.10上使用python 2.6.6.
我正在尝试决定在类docstring中放入什么信息以及在__init__方法docstring中放入什么.到目前为止,我已经在类docstring中概述了类以及如何使用它,而与初始化(参数详细信息等)直接相关的东西我放在__init__docstring中.
今天我开始想知道这是否是正确的做法,所以我看了几个内置模块,我发现该__init__方法几乎从来没有文档字符串.根据PEP8,"非公开方法不需要Docstrings",但是不 __init__公开?
同样,那些其他特殊方法,比如__getitem__,__getattr__或者__new__,他们应该有文档字符串吗?或者我应该只提一下他们在类docstring中的后果?
我感兴趣的是,他们设置变量有两个前导下划线(__loaded_blocks)从外面的parser类实例(解析器是实例解析类).Django源代码中的快速grep显示字符串loaded_blocks仅在此处出现.
现在我从来没有考虑过使用python name-mangling功能,但这实际上会隐藏自身的__loaded_blocks属性parser!要从parser您必须求助的方法中读取此属性getattr(self, "__loaded_blocks").
我是否正确地认为这只是所选属性名称的无意和未使用的副作用?或者是否有更深层次的目的?
一般来说,你为什么要做这样的事情?
编辑:为了澄清,我完全清楚,只要你不尝试__loaded_blocks从方法中访问属性parser,它就会像任何其他属性一样工作,并且它实际上不是一个受损的属性.
我正在编写一个Python程序,用于从6 GB bz2文件的中间提取数据.bzip2文件由独立可解密的数据块组成,所以我只需要找到一个块(它们由魔术位分隔),然后在内存中创建一个临时的一块bzip2文件,最后将其传递给bz2.decompress函数.容易,不是吗?
bzip2 格式最后有一个文件的crc32校验和.没问题,binascii.crc32来救援.可是等等.要校验和的数据不一定以字节边界结束,而crc32函数在整数个字节上运行.
我的计划:在除最后一个字节之外的所有字节上使用binascii.crc32函数,然后使用我自己的函数来更新最后1-7位的计算crc.但是数小时的编码和测试让我感到困惑,我的困惑可以归结为这个问题:为什么crc32("\ x00")不是0x00000000?根据维基百科的文章,它应该不是吗?
你从0b00000000开始,用32 0填充,然后用0x04C11DB7进行多项式除法,直到前8位没有剩下的,这是立即的.你的最后32位是校验和,怎么能不是全零?
我搜索了Google的答案并查看了几个CRC-32实现的代码,却没有找到任何关于为什么会这样做的线索.
知道在python中调用函数是昂贵的,这个问题的答案对优化决策有一些影响,例如将直接的单函数数值方法与面向对象的方法进行比较.所以我想知道
我的google-fu无法找到这个问题的答案.
编辑:所以总结评论并阻止更多的选票,这里有一些澄清:
我有一个从excel单元格编译的列表,使用python - 比如说listlist.单元格/列表中的每个元素都是unicode.当我打印列表时
print listlist
Run Code Online (Sandbox Code Playgroud)
我看到'u'被添加到列表的每个成员之前.但是当我打印列表时
for member in listlist:
print member
Run Code Online (Sandbox Code Playgroud)
我没有看到'u'在会员面前.
有人可以向我解释为什么会有这种差异?它是在xlrd模块中定义的吗?
我一直在玩Python,我有这个列表,我需要解决.基本上我将游戏列表键入多维数组,然后对于每个数组,它将根据第一个条目生成3个变量.
制作的数组:
Applist = [
['Apple', 'red', 'circle'],
['Banana', 'yellow', 'abnormal'],
['Pear', 'green', 'abnormal']
]
Run Code Online (Sandbox Code Playgroud)
为循环指定每个水果的名称,颜色和形状.
for i in Applist:
i[0] + "_n" = i[0]
i[0] + "_c" = i[1]
i[0] + "_s" = i[2]
Run Code Online (Sandbox Code Playgroud)
虽然这样做,我得到一个无法分配给运营商的消息.我该如何对抗这个?
预期结果将是:
Apple_n == "Apple"
Apple_c == "red"
Apple_s == "circle"
Run Code Online (Sandbox Code Playgroud)
每种水果等.
在python中,调用方法或直接在文字上查找属性是可能的,有时甚至是常见的:
>>> "-".join("abc")
'a-b-c'
>>> {1: 3, 2: 9}.pop(1)
3
>>> 3j.imag
3.0
>>> 8.0.__add__(8)
16.0
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,这不适用于整数对象:
>>> 3.__add__(42)
File "<stdin>", line 1
3.__add__(42)
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
为什么不?