如何根据Python版本兼容实现长整数类型转换?
如何根据Python版本兼容实现长整数类型转换?
这个问题我之前也踩过坑,其实是Python的变量作用域规则在搞鬼!
你遇到的报错local variable 'long' referenced before assignment,原因是这样的:在Python 2的函数内部,只要你在代码的任何分支里给某个变量(比如这里的long)赋值了,Python解释器就会把这个变量标记为局部变量——不管那个赋值的分支会不会实际执行。哪怕你是在if sys.version_info[0] >=3的分支里给long=int,Python 2里这个分支根本不会跑,但解释器还是会把long当成局部变量,直接屏蔽了全局的内置类型long。这时候你再用(long)(bar),自然会报错说局部变量还没赋值。
那怎么解决呢?其实你后来改用long_t的思路就非常对,核心就是不要直接覆盖内置的类型名称,而是用一个自定义的别名来兼容:
比如可以把版本判断的逻辑放到函数外面(模块级别),这样定义的别名全局可用,不会有作用域问题:
import sys import locale # 在模块开头统一处理类型别名 if sys.version_info[0] >= 3: long_t = int else: long_t = long def your_stat_parsing_function(): # 后续代码里直接用long_t即可 ... result[path][field] = type(stats[x][y])
或者像你实际代码里那样,在函数内部的分支里定义long_t,只要不碰内置的long名称,就不会触发局部变量的冲突。这样不管是Python 2还是3,都能正确拿到对应的整数类型:Python 2里用原生long处理大整数,Python 3里直接用int(因为Python 3的int本身就支持任意精度)。
总结一下,核心就是避开覆盖内置类型名称,用自定义别名来做版本兼容,既解决了大整数的处理问题,又绕开了Python的作用域陷阱。
备注:内容来源于stack exchange,提问作者Mikhail T.
相关产品推荐
相关产品推荐

