如何在python3中找到兼容的string.atol替代品

时间:2012-01-27 21:03:43

标签: python-3.x

我想让我的 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”。我的问题是:

  1. 在python docs中,atol作为函数(string.atol(s[, base]))引入,所以应该有括号,这里缺少。那么如何理解这种语法呢?

  2. 在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中都有效?

  3. 希望你能帮助我。

2 个答案:

答案 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