我想让我的 python2.x-Code 与2.7和3.x兼容。目前我被困在Pmw.py的一些代码中(来自python megawidgets)。看看这本词典的前三个条目:
_standardValidators = {
'numeric' : (numericvalidator, string.atol),
'integer' : (integervalidator, string.atol),
'hexadecimal' : (hexadecimalvalidator, lambda s: string.atol(s, 16)),
'real' : (realvalidator, Pmw.stringtoreal),
'alphabetic' : (alphabeticvalidator, len),
'alphanumeric' : (alphanumericvalidator, len),
'time' : (timevalidator, Pmw.timestringtoseconds),
'date' : (datevalidator, Pmw.datestringtojdn),
}
前两个条目包含“string.atol”。我的问题是:
在python docs中,atol作为函数(string.atol(s[, base])
)引入,所以应该有括号,这里缺少。那么如何理解这种语法呢?
在python 3.2中,此代码引发错误:
'numeric' : (numericvalidator, string.atol),
AttributeError: 'module' object has no attribute 'atol'
我已经尝试用python docs中的建议替换“atol”的三个出现,但这只是引发了错误:
'numeric' : (numericvalidator, string.long),
AttributeError: 'module' object has no attribute 'long'
由于我甚至不理解语法,所以我对接下来要尝试的内容感到很无奈。如何修复此代码,以便它在python 2.7和3.x中都有效?
希望你能帮助我。
答案 0 :(得分:4)
1:string.atol
是函数本身:函数是python中的第一类对象。括号仅用于呼叫。
>>> import string
>>> string.atol
<function atol at 0x00B29AB0>
>>> string.atol("aab2", 16)
43698L
2:我认为你一定有误读。 long并不存在于字符串中,但是在Python 3中并不长。当Python从用户空间中看到的方式区分小整数和长整数时,这是一个遗留物。 (这就是上面43698L末尾的“L”意思。)
只需使用int,即
'numeric': (numericvalidator, int),
答案 1 :(得分:2)
当缺少括号时,您将分配函数本身,而不是函数调用的结果。
尝试将string.atol
替换为int
。