【问题标题】:How can I call a function with a string? [duplicate]如何使用字符串调用函数? [复制]
【发布时间】:2021-02-07 17:03:53
【问题描述】:

我使用了以下代码:

from time import time
import datetime

now = datetime.datetime.now()
Report = now.strftime("%Y%m%d_%H%M%S") + "Prueba llamada de funciones" + ".txt"
modo=0



def llamar_funciones():
    if (modo==1):
        Alimentaciones_1(Report)
        Alimentaciones_2(Report)
    else:
        print("¿Que ensayos de alimentaciones quieres hacer?")
        Ensayo=input()
        Nombre_Ensayo= "Alimentaciones_" + Ensayo
        print(Nombre_Ensayo)
        Nombre_Ensayo(Report)
def Alimentaciones_1(Report):
    f = open(Report,"a")
    f.write("1.funtzioa")
    f.close()
def Alimentaciones_2(Report):
    f = open(Report,"a")
    f.write("\n2.funtzioa")
    f.close()
    
llamar_funciones()

我收到以下错误:

TypeError: 'str' 对象不可调用

如何根据变量“modo”的值调用函数1或2??

【问题讨论】:

  • 发布有关产生异常的代码的问题时,请始终包含完整的 Traceback - 复制并粘贴它,然后将其格式化为代码(选择它并输入 ctrl-k
  • Nombre_Ensayo 是一个字符串时,你期望Nombre_Ensayo(Report) 是什么?只能调用函数,不能调用字符串...
  • 错误是Nombre_Ensayo 是一个字符串,而您正试图像Nombre_Ensayo(Report) 中的函数一样使用它。不过,我不知道你想在这里做什么。
  • 你需要使用if语句
  • 我要做的是根据输入选择函数 Alimentaciones_1 或 Alimentaciones_2,以防变量“modo”不是 1。在这种情况下,输入应该是 1 或 2,这样我可以选择 Alimentaciones_1 或 Alimentaciones_2

标签: python string function object


【解决方案1】:

您只需要另一个 if 语句。不能调用字符串,但可以基于它们进行分支。

if Ensayo == "1":
    Alimentaciones_1(Report)
elif Ensayo == "2":
    Alimentaciones_2(Report)
else:
    # ... Handle invalid user input here ...

无论如何,您可以调用名称为字符串的函数,但它的编码风格很差,而且极易出错。需要明确的是,以下内容用于教育目的; 不要这样做。上面的 sn-p 是做这种事情的公认方式。

eval("Alimentaciones_{}".format(Ensayo))(Report) # <-- Bad idea

【讨论】:

  • 非常感谢!你的回答对我很有用。
  • 很高兴能帮上忙!快乐编码:)
【解决方案2】:

Python 有两个函数可以帮助你,exec() 和 eval()。 它们都接受一个字符串并将其视为 python 代码(您可以使用输入中的字符串并运行它),并且行为略有不同。

但是,这很重要,不要使用它们。完全没有。这些函数非常危险,因为它们让用户可以根据需要从您的代码中调用每个函数,这是一种不好的做法。

我建议使用 if 案例来检查您想要的值:

if my_str == "my_func":
    my_func(...)
elif my_str == "my_other_func":
    my_other_func(...)
...

这可能很乏味,但它会让您的用户调用他们需要的任何东西,而不是更多。

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 2017-06-29
    • 2020-02-16
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    相关资源
    最近更新 更多