私信  •  关注

PaulMcG

PaulMcG 最近创建的主题
PaulMcG 最近回复了
15 年前
回复了 PaulMcG 创建的主题 » 为不同版本的python维护不同版本的codebase的工作流

如果您的代码不过分依赖异常处理程序中的运行时性能,那么您甚至可能在没有单独的py3分支的情况下逃脱。虽然我不得不坚持使用“最小公分母”方法,也就是说,我必须放弃使用一些结构,比如生成器表达式和上下文管理器。我使用dict代替set,并且我所有的生成器表达式都被包装成列表理解,所以它们仍然可以回到python 2.3。我在代码的顶部有一个块负责处理一些2vs3问题(由pyparsing用户robert a clark提供):

_PY3K = sys.version_info[0] > 2
if _PY3K:
    _MAX_INT = sys.maxsize
    basestring = str
    unichr = chr
    unicode = str
    _str2dict = set
    alphas = string.ascii_lowercase + string.ascii_uppercase
else:
    _MAX_INT = sys.maxint
    range = xrange
    def _str2dict(strg):
        return dict( [(c,0) for c in strg] )
    alphas = string.lowercase + string.uppercase

我遇到的最大困难是捕捉异常的不兼容语法,这是在py3中引入的,从

except exceptiontype,varname:

except exceptionType as varname:

当然,如果您不真正需要异常变量,您只需编写:

except exceptionType:

这对py2或py3有效。但是,如果需要访问异常,仍然可以使用跨版本兼容语法:

except exceptionType:
    exceptionvar = sys.exc_info()[1]

这有一个很小的运行时惩罚,这使得它在pyparsing的某些地方不可用,所以我仍然需要维护单独的py2和py3版本。对于源合并,我使用 WinMerge ,这对于保持源代码目录同步非常有用。

因此,尽管我保留了两个版本的代码,但其中一些统一技术帮助我将差异保持在绝对不兼容的最小值。

6 年前
回复了 PaulMcG 创建的主题 » 用python从文本文件中提取数据

在序列周围写一个小包装,去掉所有的换行符:

def newline_stripper(seq):
    for s in seq:
        # or change this to just s.rstrip() to remove all trailing whitespace
        yield s.rstrip('\n')

然后在进行迭代时用它包装文件对象:

with open('text_file.txt') as f:
    for line in newline_stripper(f):
        # do something with your now newline-free lines

这将保留对文件的一次一行的读取,而不是一次全部读取,因为 read().splitlines() 会的。

15 年前
回复了 PaulMcG 创建的主题 » 你知道其他有交互模式的编程语言吗,比如python?[关闭]

Boo 在python和c类型推理和过程兼容编程之间是一个很好的中间基础,与.NET兼容,并且能够编译为clr程序集和.exe。