使用全球词典似乎不好,但为什么呢?
问题描述:
我知道在我的肠道里这是不好的,我只是不能把我的手指放在原因。使用全球词典似乎不好,但为什么呢?
variable = globals()['__builtins__'][sys.argv[1]]
对于项目中,我将实现一个字典,将得到的类名我命令行所需要的,这样我就可以限制和控制的有效输入。但是我最初写的那样,然后就像是等待,那很糟糕。我只是不能把话说清楚为什么。
有没有人知道一篇文章或以前回答可能解决这个问题?
答
如果你打算做输入检查反正它也可以写为:
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)
。
有一种更直接的方式来获得你想要的东西。 'getattr(__ builtins__,sys.argv [1])'会做同样的事情。 – 2013-05-10 20:52:20
首先,因为您总是访问'globals'的相同密钥,并且在编写代码时知道这个密钥是什么,只需要首先编写'__builtins__'而不是'globals()['__ builtins __']'。另一方面,我没有任何版本的Python可以访问甚至允许你执行'__builtins __ [foo]';你甚至是否得到这个代码运行? – jwodder 2013-05-10 20:57:19
@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