2013-05-10 38 views
1

我知道在我的腸道里這是不好的,我只是不能把我的手指放在原因。使用全球詞典似乎不好,但爲什麼呢?

variable = globals()['__builtins__'][sys.argv[1]] 

對於項目中,我將實現一個字典,將得到的類名我命令行所需要的,這樣我就可以限制和控制的有效輸入。但是我最初寫的那樣,然後就像是等待,那很糟糕。我只是不能把話說清楚爲什麼。

有沒有人知道一篇文章或以前回答可能解決這個問題?

+2

有一種更直接的方式來獲得你想要的東西。 'getattr(__ builtins__,sys.argv [1])'會做同樣的事情。 – 2013-05-10 20:52:20

+2

首先,因爲您總是訪問'globals'的相同密鑰,並且在編寫代碼時知道這個密鑰是什麼,只需要首先編寫'__builtins__'而不是'globals()['__ builtins __']'。另一方面,我沒有任何版本的Python可以訪問甚至允許你執行'__builtins __ [foo]';你甚至是否得到這個代碼運行? – jwodder 2013-05-10 20:57:19

+1

@jwodder:'__builtins__'(可在當前模塊名稱空間中使用)[可以是'__builtin__'模塊(Python 3中的'builtins'模塊)或其''.__ dict__'(後者具有'[]'支持)](https://www.pythonanywhere.com/gists/5557682/show_builtins_type.py/python2/)。 – jfs 2013-05-10 21:49:34

回答

3

如果你打算做輸入檢查反正它也可以寫爲:

ALLOWED_ARGS = {"repr", "str", "unicode"} 
funcs = {f: getattr(__builtins__, f) for f in ALLOWED_ARGS} 
# funcs.update({"custom": custom_func}) 

# I'd also assert on all functions having the same arity, 
# but this is tricky with builtins... 

func = funcs[sys.argv[1]] 

不知道爲什麼,但不知何故,更安全的在我看來。

如果你肯定的話,輸入總是正確的,你的代碼似乎對我來說很好,但__builtins__[name]不應該工作,你必須使用getattr(__builtins__, name)

相關問題