abc = pyb.batting_stats # note no brackets
# later
result = abc(2020)
如果确实需要按名称查找,可以使用getattr,如下所示:
# At the top of the script
ALLOWED_NAMES = ['batting_stats', ...]
# in the code where you need it
if abc not in ALLOWED_NAMES:
raise ValueError("Invalid name passed: %s" % abc)
result = getattr(pyb, abc)(2020)
你可能不想这样做;这是可能的,但在绝大多数情况下,这是个坏主意
选项:
如果可能的话,试着重写代码,这样你就不需要查名字了;例如,您可以更改其他代码,使其将
pyb.batting_stats
存储为函数而不是字符串如果确实需要按名称查找,可以使用
getattr
,如下所示:可能更好的方法是使用字典作为分派表:
如果传递了意外名称,则会自动引发异常
它还有一个好处,就是可以在
abc
变量中使用与方法名不同的字符串;例如,如果需要重命名函数,但在API中保留名称,或反之亦然:如果绝对必须从字符串运行一段代码,则可以使用
eval
或exec
内置函数;然而,这几乎总是一个坏主意使用
eval
和exec
经常是危险和不安全的(Common Weakness #95),因此最好完全避免使用。幸运的是,至少在Python中,几乎总是有替代方案;此外,这些替代方案通常更干净、更灵活、运行更快、调试更容易。没有其他选择的情况非常罕见相关问题 更多 >
编程相关推荐