Python 如何调用不是字符串的函数?

Python 如何调用不是字符串的函数?,python,python-3.x,Python,Python 3.x,如何以完全相同的方式在另一个函数中加载带有代码的函数 或 如何将global_variables()正确加载到我的step1()和step2()函数中,而不必在每个函数中复制/粘贴它 def全局_变量(): 全局文本 全局选项a 全局选项 全球选择权 全局下一个函数 全局下一个函数 全局下一个函数 定义步骤1(): 全局变量() txt=步骤1_文本#用正确的文本填充 选项a=步骤1a\u文本 选项b=步骤1b\u文本 选项c=步骤1C\U文本 next_function_a=step1#var

如何以完全相同的方式在另一个函数中加载带有代码的函数

如何将
global_variables()
正确加载到我的
step1()
step2()
函数中,而不必在每个函数中复制/粘贴它

def全局_变量():
全局文本
全局选项a
全局选项
全球选择权
全局下一个函数
全局下一个函数
全局下一个函数
定义步骤1():
全局变量()
txt=步骤1_文本#用正确的文本填充
选项a=步骤1a\u文本
选项b=步骤1b\u文本
选项c=步骤1C\U文本
next_function_a=step1#variable=call function
next_function_b=步骤2#变量=调用函数
下一个函数c=step5#变量=调用函数
start_step()#调用step函数
定义步骤2():
全局变量()
txt=步骤2_text#用正确的文本填充
选项a=步骤2a\u文本
选项b=步骤2b\u文本
选项c=步骤2C\U文本
下一个函数=游戏结束(step2c_文本)#变量=调用函数
next_function_b=步骤3#变量=调用函数
next_function_c=步骤2_1#变量=调用函数
start_step()#调用step函数
我预计:

global-txt
全局选项a
全局选项
全球选择权
全局下一个函数
全局下一个函数
全局下一个函数
包含在
step1()
step2()
函数中,就像每次手动复制/粘贴它一样

#在每个新步骤开始的函数
def start_步骤():
打印(txt)#打印故事
尝试=错误
选择=输入('>')#变量=用户输入提示
如果选项中的“A”或选项中的“B”或选项中的“C”:#如果变量(选项)中的语句为“0”或1,则
步骤结束(选择)
else:#如果语句不是'A'或'B'或'C',则
游戏结束(“伙计,学着打字。”)#调用dead函数并显示短信
def步骤_结束(选项):
如果选项==“A”:
打印(选项a)
下一个函数
elif选项==“B”:
打印(选项b)
下一个函数
elif选项==“C”:
打印(选项c)
下一个函数
#通过“游戏结束”或“赢得”游戏而无错误退出程序的功能
def游戏结束(原因):#函数名(参数)
打印(为什么)#显示参数(“为什么”)
退出(0)#正常退出,无错误。

正如评论所建议的,您可能需要手动对其进行全局搜索,但有一些方法可以解决此问题

您可以这样做:

def step(numb):
    global txt   
    global option_a
    global option_b
    global option_c
    global next_function_a
    global next_function_b
    global next_function_c
    if num == 1:
        txt = step1_text # fill with correct text

        option_a = step1a_text
        option_b = step1b_text
        option_c = step1c_text

        next_function_a = step1_1 # variable = call function
        next_function_b = step2 # variable = call function
        next_function_c = step5 # variable = call function

        start_step() # call step function
    elif numb == 2:
        txt = step2_text # fill with correct text

        option_a = step2a_text
        option_b = step2b_text
        option_c = step2c_text

        next_function_a = game_over(step2c_text) # variable = call function
        next_function_b = step3 # variable = call function
        next_function_c = step2_1 # variable = call function
这样您就可以编写更多的步骤


希望有帮助:)

如果这些变量名存在于定义函数的模块范围内,则需要在
step1()
step2()
中进行全局声明,代码才能正常工作

相反,您可以在模块的作用域中创建一个字典,然后在
step1()
step2()中修改该字典

步骤结束
重构为:

def step_end(choice):
    if choice =="A":
        print(gv_s['option_a'])
        gv_s['next_function_a']()
    elif choice =="B":
        print(gv_s['option_b'])
        gv_s['next_function_b']()
    elif choice =="C":
        print(gv_s['option_c'])
        gv_s['next_function_c']()
这将使它发挥作用,但仍然可能不是组织流程的最佳方式


另一个选项可能是
step1
step2
只返回选项字典,并将返回值分配给模块名称空间中的名称

def step1():
    return {'txt':step1_text,
            'option_a':step1a_text,
            'option_b':step1b_text,
            'option_c':step1c_text,
            'next_function_a':step1_1,
            'next_function_b':step2,
            'next_function_c':step5}

def step2():
    return {'txt':step2_text,
            'option_a':step2a_text,
            'option_b':step2b_text,
            'option_c':step2c_text,
            'next_function_a':game_over(step2c_text),
            'next_function_b':step3,
            'next_function_c':step2_1}

gv_s = step1()
# or
#gv_s = step2()
start_step()
使用
步骤结束
访问模块级字典

def step_end(choice):
    if choice =="A":
        print(gv_s['option_a'])
        gv_s['next_function_a']()
    elif choice =="B":
        print(gv_s['option_b'])
        gv_s['next_function_b']()
    elif choice =="C":
        print(gv_s['option_c'])
        gv_s['next_function_c']()


你可以用字典来代替。

函数之外的任何东西都不会影响该函数中变量的局部/全局状态,因此你试图做的根本不可能。也许将所有这些函数都作为一个类的方法,允许您分配给实例属性,如
self.txt
,而无需事先声明。看起来您还没有完全理解Python中的作用域规则。在
global\u variables
函数中声明的全局变量仅在该函数中已知。模块作用域中的这些变量是什么定义函数的模块?为什么需要将它们声明为
global
?@wwii I将它们声明为
global
,以便在
start\u步骤
功能中使用它们。为了更好地理解,让我在这里更新并包含该函数。hehe@juanpa.arrivillaga在搜索全局变量的dupe或
替代变量时,我看到了您的一个答案。请注意,您实际上可以通过调用
globals()来修改函数中的全局变量
和修改返回的
dict
,方法与使用
gv\u s
相同。从全局范围中删除
gv_s
,只需将每个函数的第一行
gv_s=globals()
,其余的代码就可以按照编写的方式工作(变量的读者可以通过名称正常引用它们,而无需
dict
语法)。我同意。我没有使用
globals()
,因为大多数/许多/所有的问答都在这里,所以提到修改这条命令似乎会引发分歧和赞成或反对的意见。如果需要,您可以编辑我的答案。此外,我不确定这些名称是否存在于所示函数之外的任何地方。这样做肯定是可疑的(主要的代码气味),但根据语言规范,这也是绝对合法的。它变得棘手的部分(与实现相关,通常是不正确的)是修改
locals()返回的
dict
(或等效地,通过函数中没有参数的
vars()
)。我不打算将其编辑到答案中,只是将其作为一个选项提及。哪个选项可以被视为保持代码干净和易于维护的“最佳实践”?如果不了解您的项目,很难说。我在这里看到过类似的问题,有些人喜欢保留glo
def step_end(choice):
    if choice =="A":
        print(gv_s['option_a'])
        gv_s['next_function_a']()
    elif choice =="B":
        print(gv_s['option_b'])
        gv_s['next_function_b']()
    elif choice =="C":
        print(gv_s['option_c'])
        gv_s['next_function_c']()