您如何优雅地处理失败的未来功能导入?如果用户使用Python 2.5运行,并且我的模块中的第一个语句是:
from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)
为Python 2.5编译此模块将失败,并带有:
File "__init__.py", line 1
from __future__ import print_function
SyntaxError: future feature print_function is not defined
Run Code Online (Sandbox Code Playgroud)
我想告诉用户他们需要用Python> = 2.6重新运行程序,并且可能提供一些如何操作的说明.但是,引用PEP 236:
在future_statement之前可以出现的唯一行是:
- 模块docstring(如果有的话).
- 评论.
- 空白行.
- 其他future_statements.
所以我做不了类似的事情:
import __future__
if hasattr(__future__, 'print_function'):
from __future__ import print_function
else:
raise ImportError('Python >= 2.6 is required')
Run Code Online (Sandbox Code Playgroud)
因为它产生:
File "__init__.py", line 4
from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
Run Code Online (Sandbox Code Playgroud)
来自PEP的这个片段似乎给了内联的希望:
问:我想将future_statements包装在try/except块中,因此我可以使用不同的代码,具体取决于我正在运行的Python版本.为什么我不能?
A:对不起!try/except是一个运行时功能; future_statements主要是编译时的噱头,你的try/except在编译完成后很久就会发生.也就是说,当你尝试使用/ except时,对模块有效的语义已经完成了.由于试/除非将无法完成它看起来 像它应该做到,它只是不允许的.我们还希望保持这些特殊陈述非常容易找到和识别.
请注意,您 …
我不知道是否有一个原因,有没有first(iterable)在Python内置的功能,有点类似于any(iterable)和all(iterable)(可能一STDLIB模块中夹着地方,但我没有看到它itertools).first将执行短路发生器评估,以便可以避免不必要的(和可能无限数量的)操作; 即
def identity(item):
return item
def first(iterable, predicate=identity):
for item in iterable:
if predicate(item):
return item
raise ValueError('No satisfactory value found')
Run Code Online (Sandbox Code Playgroud)
这样你可以表达如下内容:
denominators = (2, 3, 4, 5)
lcd = first(i for i in itertools.count(1)
if all(i % denominators == 0 for denominator in denominators))
Run Code Online (Sandbox Code Playgroud)
很明显,list(generator)[0]在这种情况下你不能这样做,因为发生器不会终止.
或者,如果你有一堆正则表达式匹配(当它们都具有相同的groupdict接口时很有用):
match = first(regex.match(big_text) for regex in regexes)
Run Code Online (Sandbox Code Playgroud)
通过避免list(generator)[0]和短路匹配来节省大量不必要的处理.
Python文档说:
re.MULTILINE:指定时,模式字符'^'匹配字符串的开头和每行的开头(紧跟在每个换行符之后)...默认情况下,'^'仅匹配字符串的开头...
那么当我得到以下意外结果时会发生什么?
>>> import re
>>> s = """// The quick brown fox.
... // Jumped over the lazy dog."""
>>> re.sub('^//', '', s, re.MULTILINE)
' The quick brown fox.\n// Jumped over the lazy dog.'
Run Code Online (Sandbox Code Playgroud) 现在我有以下内容.vimrc:
au BufWritePost *.c,*.cpp,*.h !ctags -R
Run Code Online (Sandbox Code Playgroud)
这有一些问题:
当你将这两个问题结合起来时,我最终推迟了额外的输入(在ctags -R完成之前),然后看到恼人的错误信息,并且必须再次按回车键.
我知道这听起来不是什么大不了的事,但随着我在某一天所做的文件写入量的增加,它往往会变得非常烦人.必须有一个更好的方法来做到这一点!
我有两个分支,默认和branch1.我们团队中的一个人错误地将branch1合并.branch1中的内容尚未准备好与默认值合并(它包含构建和部署环境的主要返工).
我们做了'hg backout'的实验,退出合并(不确定这是正确的方法).然后从默认情况下删除branch1中的更改,这很好 - 但我们不能使用branch1重新合并.
我们该如何解决这个问题?
在命令行上是否有相当于svn对Perforce的责任?p4 annotate不显示用户名 - 仅更改集编号(没有祖先历史记录!).
我目前必须通过祖先跟踪代码并与文件日志进行比较,并且必须有一种更简单的方法 - 也许是F/OSS实用程序?
我正在尝试使用通用的makefile来合并一些构建信息.我的问题是我想从不同的子目录级别使用该makefile,这使得工作目录值(pwd)不可预测.例如:
# Makefile.common
TOP := $(shell pwd)
COMPONENT_DIR := $(TOP)/component
COMPONENT_INC := $(COMPONENT_DIR)/include
COMPONENT_LIB := $(COMPONENT_DIR)/libcomponent.a
Run Code Online (Sandbox Code Playgroud)
如果我Makefile.common从子目录中包含,就像这样,$(TOP)目录是不正确的,其他一切都遵循:
# other_component/Makefile
include ../Makefile.common
# $(COMPONENT_LIB) is incorrectly other_component/component
Run Code Online (Sandbox Code Playgroud)
Makefile.common使用自己的目录路径而不是更善变的最佳方法是什么pwd?
协同程序和资源获取的结合似乎可能会产生一些意想不到的(或不直观的)后果.
基本问题是这样的事情是否有效:
def coroutine():
with open(path, 'r') as fh:
for line in fh:
yield line
Run Code Online (Sandbox Code Playgroud)
它做的.(你可以测试一下!)
更深层次的关注是with应该是替代方案finally,在此确保资源在块结束时释放.协同程序可以暂停和恢复执行中的with块,所以如何在冲突解决?
例如,如果在协程内部和外部打开一个带有读/写的文件,而协程尚未返回:
def coroutine():
with open('test.txt', 'rw+') as fh:
for line in fh:
yield line
a = coroutine()
assert a.next() # Open the filehandle inside the coroutine first.
with open('test.txt', 'rw+') as fh: # Then open it outside.
for line in fh:
print 'Outside coroutine: %r' % repr(line)
assert a.next() # Can we still use …Run Code Online (Sandbox Code Playgroud) 我正在将一个二元组数组从一个域(日期)映射到另一个域(时间戳).不幸的是,它看起来像jQuery.map自动展平我返回的两元组,我没有看到do_not_flatten参数.
我是否遗漏了库中不会自动展平的其他内容?
附录:我认为我不应该使用Array.map,它不会自动展平,因为它是JavaScript 1.6.据我了解,jQuery应该抽象出我出于兼容性原因运行的JavaScript版本.
我是C++领域的C/Python程序员,第一次使用STL.
在Python中,使用另一个列表扩展列表使用以下.extend方法:
>>> v = [1, 2, 3]
>>> v_prime = [4, 5, 6]
>>> v.extend(v_prime)
>>> print(v)
[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)
我目前使用这种算法方法在C++中扩展向量:
v.resize(v.size() + v_prime.size());
copy(v_prime.begin(), v_prime.end(), v.rbegin());
Run Code Online (Sandbox Code Playgroud)
这是扩展向量的规范方法,还是有一种我更缺失的简单方法?