如何执行python中存储为变量的字符串

2024-09-27 23:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个变量abc,定义为'batting_stats',希望运行一行代码'pyb.batting_stats(2020)'。我想使用字符串语法通过将abc与'pyb.''(2020)'连接起来来创建行,然后运行那行代码-我如何才能做到这一点?我似乎在创建一个更大的字符串实例,而不是一行可运行的代码。干杯


Tags: 实例字符串代码定义stats语法abcpyb
1条回答
网友
1楼 · 发布于 2024-09-27 23:28:02

你可能不想这样做;这是可能的,但在绝大多数情况下,这是个坏主意

选项:

  • 如果可能的话,试着重写代码,这样你就不需要查名字了;例如,您可以更改其他代码,使其将pyb.batting_stats存储为函数而不是字符串

    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)
    
  • 可能更好的方法是使用字典作为分派表:

    dispatch_table = {
         'batting_stats': pyb.batting_stats,
         ...: ...,
    }
    result = dispatch_table[abc](2020)
    

    如果传递了意外名称,则会自动引发异常

    它还有一个好处,就是可以在abc变量中使用与方法名不同的字符串;例如,如果需要重命名函数,但在API中保留名称,或反之亦然:

    dispatch_table = {
         'battingstats': pyb.batting_stats,  # legacy name
         'batting_stats': pyb.batting_stats,
         ...: ...,
    }
    result = dispatch_table[abc](2020)
    
  • 如果绝对必须从字符串运行一段代码,则可以使用evalexec内置函数;然而,这几乎总是一个坏主意

    使用evalexec经常是危险和不安全的(Common Weakness #95),因此最好完全避免使用。幸运的是,至少在Python中,几乎总是有替代方案;此外,这些替代方案通常更干净、更灵活、运行更快、调试更容易。没有其他选择的情况非常罕见

相关问题 更多 >

    热门问题