2015-11-07 56 views
1

新的Python和尚未使用或遇到__builtin__和很好奇什么下面的代码实际上是这样做的:使用理解尝试,除非__builtin__

import sys 

try: 
    import __builtin__ 
    input = getattr(__builtin__, 'raw_input') 
except (ImportError, AttributeError): 
    pass 

username = input("username: ") 
password = input("password: ") 

这段代码基本上检查是否不是脚本正在运行Python 2或Python 3,如果它是Python 2,input()转换为raw_input()

回答

2

这是写得很差的代码,如果input()存在input(),则代码raw_input()。这使得它与两个的Python 2和Python 3兼容的更简单的方法来做到这一点会是这样:

try: 
    input = raw_input 
except NameError: 
    pass 

username = input("username: ") 
password = input("password: ") 

__builtin__模块是模块,所有的内置对象,如input()raw_input()现场。但在这种情况下我们并不需要它。在Python 3.x中,这被称为builtins,这就是为什么此代码的作者正在捕获ImportError

如果你需要做这种事一般,最好用six而不是手工编码所有这些东西。

+0

Thx为答案。你能解释一下还是说明为什么我发布的代码写得不好吗?它打算做什么过于复杂? – AdjunctProfessorFalcon

+1

@ Malvin9000:是的,非常。没有必要导入'__builtin__'(见答案),如果你进行导入(只需编写'__builtin __。raw_input'),不需要使用'getattr()',并且不需要捕获'AttributeError'(3.x在你达到那个点之前会引发'ImportError')。 – Kevin