小编Sco*_*ths的帖子

运行具有典型测试目录结构的unittest

即使是简单的Python模块,非常常见的目录结构似乎是将单元测试分成它们自己的test目录:

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.
Run Code Online (Sandbox Code Playgroud)

例如,看看这个Python项目如何.

我的问题是,实际运行测试的常用方法什么?我怀疑这对除了我以外的所有人都是显而易见的,但你不能只是python test_antigravity.py从测试目录运行,因为import antigravity它将失败,因为模块不在路径上.

我知道我可以修改PYTHONPATH和其他搜索路径相关的技巧,但我不能相信这是最简单的方法 - 如果你是开发人员,那就没关系,但是如果他们只是想检查测试,那么期望用户使用是不现实的通过.

另一种选择只是将测试文件复制到另一个目录中,但它看起来有点愚蠢,并且忽略了将它们放在一个单独的目录中的重点.

那么,如果您刚刚将源代码下载到我的新项目中,您将如何运行单元测试?我更喜欢一个能让我对用户说的答案:"运行单元测试做X."

python unit-testing

641
推荐指数
13
解决办法
18万
查看次数

为什么Python的mmap不适用于大文件?

[编辑:此问题仅适用于32位系统.如果你的计算机,你的操作系统和你的python实现是64位的,那么mmap-ing巨大的文件可以正常工作并且非常高效.

我正在编写一个模块,其中包括允许按位读取文件访问.这些文件可能很大(数百GB),所以我编写了一个简单的类,让我像处理字符串一样处理文件并隐藏所有的搜索和阅读.

当我写我的包装类时,我不知道mmap模块.在阅读mmap的文档时,我认为"很棒 - 这正是我所需要的,我将取出我的代码并用mmap替换它.它可能效率更高,删除代码总是好的."

问题是mmap不适用于大文件!这对我来说非常令人惊讶,因为我认为它可能是最明显的应用程序.如果文件超过几千兆字节,那么我得到一个EnvironmentError: [Errno 12] Cannot allocate memory.这只发生在32位Python构建中,所以它似乎耗尽了地址空间,但我找不到任何关于此的文档.

我的代码就是

f = open('somelargefile', 'rb')
map = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是我错过了一些明显的东西吗?有没有办法让mmap可以在大文件上移植,或者我应该回到我天真的文件包装器?


更新:似乎有一种感觉,Python mmap应该具有与POSIX mmap相同的限制.为了更好地表达我的挫败感,这是一个简单的类,它具有mmap的一小部分功能.

import os

class Mmap(object):
    def __init__(self, f):
        """Initialise with a file object."""
        self.source = f

    def __getitem__(self, key):
        try:
            # A slice
            self.source.seek(key.start, os.SEEK_SET)
            return self.source.read(key.stop - key.start)
        except AttributeError:
            # single element
            self.source.seek(key, os.SEEK_SET)
            return self.source.read(1)
Run Code Online (Sandbox Code Playgroud)

它是只读的,并没有做任何花哨的事情,但我可以像使用mmap一样:

map2 = Mmap(f)
print map2[0:10]
print map2[10000000000:10000000010]
Run Code Online (Sandbox Code Playgroud)

除了文件大小没有限制.真的不太难......

python memory performance mmap

44
推荐指数
5
解决办法
3万
查看次数

Python - 在3.1中是什么不是3.1?这么多东西都被反向移植了,什么不是?

我一直在关注Python 3.x的传奇,并且已经看到3.x功能逐渐被反向移植到2.x线.

我使用的大多数库都没有移植过,有些(例如Twisted)似乎在不同程度上对3.x隐蔽或过于敌视.无论如何,其中很多兼容版本的发展很少.特别是较大的那些.

所以,我的问题是,在已经向后移植的所有功能的情况下,3.x中仍然可以提供哪些内容还没有后端移植?这是很容易找到的东西已经被移植,但不还剩下些什么.

现在,移植到3.x似乎只是痛苦,我看不到收益; 也许一个"只在3.x"列表会让我看到光...

谢谢,

斯图

python python-2.7 python-3.x

26
推荐指数
1
解决办法
1398
查看次数

可以像Python 2.6中的oct()和hex()一样重载bin()吗?

在Python 2.6(及更早版本)中hex(),oct()内置函数可以通过定义__hex____oct__特殊函数在类中重载.但是,没有一个__bin__特殊的函数来重载Python 2.6的新bin()内置函数的行为.

我想知道是否有任何方式可以灵活地重载bin(),如果不是,我想知道为什么不一致的界面?

我知道__index__可以使用特殊功能,但这不灵活,因为它只能返回一个整数.我的特定用例来自bitstring模块,其中前导零位被认为是重要的:

>>> a = BitString(length=12)       # Twelve zero bits
>>> hex(a)
'0x000'
>>> oct(a)
'0o0000'
>>> bin(a)
'0b0' <------ I want it to output '0b000000000000'
Run Code Online (Sandbox Code Playgroud)

我怀疑没有办法实现这一目标,但我认为这不会有问题!

python binary overloading python-2.6

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

连接运算符+或,

var1 = 'abc'
var2 = 'xyz'

print('literal' + var1 + var2) # literalabcxyz
print('literal', var1, var2) # literal abc xyz
Run Code Online (Sandbox Code Playgroud)

...除了自动空格','两者之间的区别是什么?哪个正常使用,哪个也是最快?

谢谢

python concatenation python-3.x

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

为不可变对象重用现有对象?

在Python中,如何重用现有的相等的不可变对象(就像这样做str)?这可以通过定义__hash__方法来完成,还是需要更复杂的措施?

python immutability

11
推荐指数
1
解决办法
2334
查看次数

Python - Virtualenv,python 3?

似乎每个人都推荐virtualenv用于多个python版本(在osx上),但它是否适用于python 3.0?我下载了它,它似乎没有...而且我真的不明白它是如何工作的,你能一次打开env吗?我想要的是离开系统python 2.5(显然),并让python 3.1.1与subversion pygame编写我自己的东西,和python 2.6与正常的稳定pygame用来运行其他的东西,如从pygame下载的pygame游戏.ORG.有关如何实现这一目标的任何帮助?谢谢.

好吧,我意识到virtualenv不是我想要的.

python macos pygame virtualenv python-3.x

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

生成10000位随机序列

有没有一种更有效的方法在Python中生成10 kBit(10,000位)随机二进制序列而不是在循环中附加0和1?

python binary

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

Pythonic是否可以根据函数的输入返回可迭代或不可迭代的函数?

(阅读Alex的答案后更新了标题和内容)

一般来说,我认为它被认为是一种函数的坏形式(非Pythonic),有时根据其参数返回可迭代的,有时是单个项.

例如,struct.unpack即使它只包含一个项目,也总是返回一个元组.

我正在尝试最终确定模块的API,并且我有一些函数可以采用一个或多个参数(via *args),如下所示:

a = s.read(10)        # reads 10 bits and returns a single item
b, c = s.read(5, 5)   # reads 5 bits twice and returns a list of two items.
Run Code Online (Sandbox Code Playgroud)

因此,如果只有一个参数,则返回单个项目,否则返回列表.现在我认为这很好,并不会令人困惑,但我怀疑其他人可能不同意.

这些函数最常见的用例是只返回一个项目,所以总是返回一个列表(或元组)感觉错误:

a, = s.read(10)       # Prone to bugs when people forget to unpack the object
a = s.read(10)[0]     # Ugly and it's not clear only one item is being returned
Run Code Online (Sandbox Code Playgroud)

另一个选择是有两个功能:

a = s.read(10)
b, c = s.read_list(5, 5)
Run Code Online (Sandbox Code Playgroud)

这没关系,但它使API混乱并要求用户记住两倍的功能而不添加任何值.

所以我的问题是:有时会返回一个可迭代的,有时一个项目令人困惑和非Pythonic?如果是这样,什么是最好的选择? …

python return-value

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

在Python中避免不必要的切片复制

对于像这样的情况,是否存在避免无意义切片复制的常用习惯用法:

>>> a = bytearray(b'hello')
>>> b = bytearray(b'goodbye, cruel world.')
>>> a.extend(b[14:20])
>>> a
bytearray(b'hello world')
Run Code Online (Sandbox Code Playgroud)

在我看来,b[14:20]创建切片时会发生不必要的复制.而不是在内存中创建一个新的切片给extend我想说"只使用当前对象的这个范围".

有些方法可以帮助您使用切片参数,例如count:

>>> a = bytearray(1000000)       # a million zero bytes
>>> a[0:900000].count(b'\x00')   # expensive temporary slice
900000
>>> a.count(b'\x00', 0, 900000)  # helpful start and end parameters
900000
Run Code Online (Sandbox Code Playgroud)

但很多,就像extend在我的第一个例子中,没有这个功能.

我意识到,对于许多应用程序而言,我所说的将是微优化,所以在任何人问之前 - 是的,我已经描述了我的应用程序,这对我的案例来说值得担心.

我在下面有一个"解决方案",但欢迎任何更好的想法.

python optimization idioms

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