即使是简单的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."
[编辑:此问题仅适用于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 3.x的传奇,并且已经看到3.x功能逐渐被反向移植到2.x线.
我使用的大多数库都没有移植过,有些(例如Twisted)似乎在不同程度上对3.x隐蔽或过于敌视.无论如何,其中很多兼容版本的发展很少.特别是较大的那些.
所以,我的问题是,在已经向后移植的所有功能的情况下,3.x中仍然可以提供哪些内容还没有后端移植?这是很容易找到的东西已经被移植,但不还剩下些什么.
现在,移植到3.x似乎只是痛苦,我看不到收益; 也许一个"只在3.x"列表会让我看到光...
谢谢,
斯图
在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)
我怀疑没有办法实现这一目标,但我认为这不会有问题!
var1 = 'abc'
var2 = 'xyz'
print('literal' + var1 + var2) # literalabcxyz
print('literal', var1, var2) # literal abc xyz
Run Code Online (Sandbox Code Playgroud)
...除了自动空格','两者之间的区别是什么?哪个正常使用,哪个也是最快?
谢谢
在Python中,如何重用现有的相等的不可变对象(就像这样做str)?这可以通过定义__hash__方法来完成,还是需要更复杂的措施?
似乎每个人都推荐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中生成10 kBit(10,000位)随机二进制序列而不是在循环中附加0和1?
(阅读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?如果是这样,什么是最好的选择? …
对于像这样的情况,是否存在避免无意义切片复制的常用习惯用法:
>>> 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 ×10
python-3.x ×3
binary ×2
idioms ×1
immutability ×1
macos ×1
memory ×1
mmap ×1
optimization ×1
overloading ×1
performance ×1
pygame ×1
python-2.6 ×1
python-2.7 ×1
return-value ×1
unit-testing ×1
virtualenv ×1