2012-01-27 42 views
2

我想让我的python2.x-Code兼容2.7和3.x.目前我被困在Pmw.py的一些代码中(来自python megawidgets)。有一个看看这个字典的前三项:如何找到python3中string.atol的兼容替代方案

_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文档蒂被引入作为一个函数(string.atol(s[, base])),所以应该有括号,这是在这里失踪。那么如何理解这个语法呢?

  2. 在蟒蛇3.2这段代码引发错误:

    'numeric'  : (numericvalidator,  string.atol), 
    AttributeError: 'module' object has no attribute 'atol' 
    

    我已经尝试过长替换的“蒂”三个OCCURENCES,像Python文档建议,但只是引发的错误:

    'numeric'  : (numericvalidator,  string.long), 
    AttributeError: 'module' object has no attribute 'long' 
    

    因为我甚至不理解语法,所以我对接下来要尝试的东西感到无奈。这段代码是如何修复的,以便它能够在python 2.7和3.x中使用?

希望你能帮助我。

+0

“在蟒蛇3.2这段代码引发错误:” - 你忘了说的错误是什么是。 – 2012-01-28 04:46:48

+0

@LennartRegebro:他确实说了什么是错误信息,虽然 - 他粘贴了AttributeError。格式化有一些不足之处,但这是他的第一个。 :^) – DSM 2012-01-28 05:05:56

+0

@DSM对,你是我的坏人。格式不知何故,我的眼睛只是跳过它, – 2012-01-28 07:43:16

回答

4

1:string.atol是函数本身:函数是python中的第一类对象。括号仅用于呼叫。

>>> import string 
>>> string.atol 
<function atol at 0x00B29AB0> 
>>> string.atol("aab2", 16) 
43698L 

2:我想你一定是误解。长时间不活在字符串中,但是Python 3中并没有太长的时间。当Python以小方块和长整数的方式区分用户空间时,这是一个遗留问题。 (这是什么“L”上43698L以上方式结束。)

简单地使用int,即

'numeric': (numericvalidator, int), 
+0

谢谢,这工作正常。 – 2012-01-27 21:30:07

+1

很高兴听到它。传统说,你应该点击答案旁边的小复选标记。 :-) – DSM 2012-01-27 21:33:13

1

当括号丢失时,您将分配函数本身,而不是函数调用的结果。请使用int替换string.atol

+0

'长'不存在于Python 3.2,但。 – DSM 2012-01-27 21:16:03

+0

@DSM,谢谢 - 我认为如此,但不确定。我仍然在2.7。 – 2012-01-27 21:22:47