2015-11-07 53 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