小编cdl*_*ary的帖子

如何优雅地处理由于旧解释器版本导致的失败的未来功能(__future__)导入?

您如何优雅地处理失败的未来功能导入?如果用户使用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时,对模块有效的语义已经完成了.由于试/除非将无法完成它看起来 像它应该做到,它只是不允许的.我们还希望保持这些特殊陈述非常容易找到和识别.

请注意,您 …

python python-import

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

为什么Python中没有第一个(可迭代的)内置函数?

我不知道是否有一个原因,有没有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 iterator generator

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

带有标志的Python re.sub不会替换所有出现的内容

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)

python regex

57
推荐指数
3
解决办法
4万
查看次数

Vim自动生成ctags

现在我有以下内容.vimrc:

au BufWritePost *.c,*.cpp,*.h !ctags -R
Run Code Online (Sandbox Code Playgroud)

这有一些问题:

  1. 它很慢 - 为自上次标记生成以来未更改的文件重新生成标记.
  2. 由于不可避免的"按Enter或键入命令继续",我必须在写入文件后再次按下输入按钮.

当你将这两个问题结合起来时,我最终推迟了额外的输入(在ctags -R完成之前),然后看到恼人的错误信息,并且必须再次按回车键.

我知道这听起来不是什么大不了的事,但随着我在某一天所做的文件写入量的增加,它往往会变得非常烦人.必须有一个更好的方法来做到这一点!

vim autocomplete ctags

54
推荐指数
4
解决办法
3万
查看次数

如何在Mercurial中退出合并,然后再与该分支重新合并?

我有两个分支,默认和branch1.我们团队中的一个人错误地将branch1合并.branch1中的内容尚未准备好与默认值合并(它包含构建和部署环境的主要返工).

我们做了'hg backout'的实验,退出合并(不确定这是正确的方法).然后从默认情况下删除branch1中的更改​​,这很好 - 但我们不能使用branch1重新合并.

我们该如何解决这个问题?

version-control mercurial dvcs

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

Perforce责备

在命令行上是否有相当于svn对Perforce的责任?p4 annotate不显示用户名 - 仅更改集编号(没有祖先历史记录!).

我目前必须通过祖先跟踪代码并与文件日志进行比较,并且必须有一种更简单的方法 - 也许是F/OSS实用程序?

svn version-control perforce

49
推荐指数
3
解决办法
2万
查看次数

常见的GNU makefile目录路径

我正在尝试使用通用的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?

makefile

48
推荐指数
2
解决办法
6万
查看次数

从Python中的"with"块中获取是否安全(以及为什么)?

协同程序和资源获取的结合似乎可能会产生一些意想不到的(或不直观的)后果.

基本问题是这样的事情是否有效:

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)

python resources coroutine

44
推荐指数
2
解决办法
6347
查看次数

是否有一个不自动展平的jQuery map实用程序?

我正在将一个二元组数组从一个域(日期)映射到另一个域(时间戳).不幸的是,它看起来像jQuery.map自动展平我返回的两元组,我没有看到do_not_flatten参数.

我是否遗漏了库中不会自动展平的其他内容?

附录:我认为我不应该使用Array.map,它不会自动展平,因为它是JavaScript 1.6.据我了解,jQuery应该抽象出我出于兼容性原因运行的JavaScript版本.

jquery functional-programming

44
推荐指数
2
解决办法
4225
查看次数

C++使用另一个向量扩展向量

我是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)

这是扩展向量的规范方法,还是有一种我更缺失的简单方法?

c++ vector

38
推荐指数
4
解决办法
3万
查看次数