小编Lau*_*low的帖子

itertools中的izip_longest:这里发生了什么?

我很想知道下面的代码是如何工作的.它来自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)

python python-itertools

7
推荐指数
2
解决办法
5055
查看次数

Python的__new__有哪些用例?

我理解是什么__new__(以及它与之有什么不同__init__)所以我对定义不感兴趣,我对何时以及如何使用感兴趣__new__.

文件说:

在一般情况下,你不应该需要重写__new__,除非你继承一个不变型像str,int,unicodetuple

但我无法想到使用其他情况__new__或如何正确使用它(例如,当子类化不可变类型或为什么在这种情况下需要它时).

那么,何时,为什么以及如何使用__new__

我对用例很感兴趣,而不是它的用途(我知道它的作用).

python

7
推荐指数
1
解决办法
852
查看次数

如何轮询文件以进行更改?

问题

我希望下面的脚本最多打印一个事件然后停止(它的编写只是为了说明问题).

#!/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.

python udev polling

6
推荐指数
1
解决办法
4580
查看次数

将docstrings放在特殊方法上?

我正在尝试决定在类docstring中放入什么信息以及在__init__方法docstring中放入什么.到目前为止,我已经在类docstring中概述了类以及如何使用它,而与初始化(参数详细信息等)直接相关的东西我放在__init__docstring中.

今天我开始想知道这是否是正确的做法,所以我看了几个内置模块,我发现该__init__方法几乎从来没有文档字符串.根据PEP8,"非公开方法不需要Docstrings",但是不 __init__公开?

同样,那些其他特殊方法,比如__getitem__,__getattr__或者__new__,他们应该有文档字符串吗?或者我应该只提一下他们在类docstring中的后果?

python docstring

6
推荐指数
1
解决办法
813
查看次数

为什么要从*outside*the class中设置"private"python属性?

阅读Django源代码我发现了这个功能.这是标记的实现.

我感兴趣的是,他们设置变量有两个前导下划线(__loaded_blocks)从外面parser类实例(解析器是实例解析类).Django源代码中的快速grep显示字符串loaded_blocks仅在此处出现.

现在我从来没有考虑过使用python name-mangling功能,但这实际上会隐藏自身的__loaded_blocks属性parser!要从parser您必须求助的方法中读取此属性getattr(self, "__loaded_blocks").

我是否正确地认为这只是所选属性名称的无意和未使用的副作用?或者是否有更深层次的目的?

一般来说,你为什么要做这样的事情?

编辑:为了澄清,我完全清楚,只要你不尝试__loaded_blocks从方法中访问属性parser,它就会像任何其他属性一样工作,并且它实际上不是一个受损的属性.

python django

6
推荐指数
1
解决办法
132
查看次数

Python CRC-32问题

我正在编写一个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 crc32 bzip2

5
推荐指数
1
解决办法
6692
查看次数

创建类实例需要多少函数调用?

知道在python中调用函数是昂贵的,这个问题的答案对优化决策有一些影响,例如将直接的单函数数值方法与面向对象的方法进行比较.所以我想知道

  • 所需的函数调用的典型数量是多少?
  • 所需的最小功能调用数是多少?
  • 什么增加了通话次数?
  • 用户创建的类与内置类相比如何?
  • 对象删除(包括垃圾收集)怎么样?

我的google-fu无法找到这个问题的答案.

编辑:所以总结评论并阻止更多的选票,这里有一些澄清:

  • 与调用普通的python函数相比,我对python实例创建的时间复杂性感兴趣
  • 出于这个问题的目的,让我们将自己限制在最新的CPython版本中.

python

5
推荐指数
1
解决办法
213
查看次数

使用python打印列表

我有一个从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

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

Python列表作为变量名称

我一直在玩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 arrays variables list multidimensional-array

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

为什么我不能直接在int对象上调用方法?

可能重复:
访问python int literals方法
Integer literal是Python中的一个对象?

在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)

为什么不?

python

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