How do you call a Function from a Variable? (Python)
在你要求复制之前我研究了以下内容:使用变量的python函数调用
从具有函数名称的字符串调用模块的函数
在python中按变量名执行函数
https://ubuntuforums.org/showthread.php?T=1110989
还有更多,但没有运气。
我正在开发一个游戏。现在我正在处理保存/加载功能,但是我什么也没得到。
我想从另一个py或txt文件中提取一段文本,并让我的主py文件读取该文本,然后根据第二个文件中的文本字符串调用函数。
脚本1:
1 2 3 4 5 6 7 8 9 10
| #imports
from script2 import SaveCode
#Code
def Test():
print('Hello, World!')
callable(SaveCode) |
脚本2:
号
这行不通。有人能帮我吗?
- 请添加回溯。
- @Scharette没有回溯。它不会显示任何内容。它不调用任何东西,只是退出,就像程序完成一样。
- 你期望得到什么样的产出?
- @cdarke它应该调用Test()函数,但它不这样做。
- callable在哪里定义?
- callable只是一个测试,如果有什么可以调用的话。它是内置的。
- 我应该使用什么从另一个文件调用test()?
- callable()返回true或false。它不执行函数。
- 有一种方法可以告诉python通过字符串'Test()'执行Test()函数,但是当有更干净、更安全的替代方案时,用这种方式组织代码并不是一个好主意。
- retn = eval(SaveCode)将起作用,但(见其他评论)是危险的。为什么你需要两个模块?
- 因为我不知道如何使用同一个文件编辑Python文件的内容
- 您不需要编辑它,您可以通过为变量分配函数来选择不同的函数,例如:runit = Func1或runit = Func2,然后调用runit()。@bahrom答案中的dictionary方法是一种很好的方法(称为分派表)。
- 为什么要让脚本编辑python文件?我以为你只是想在游戏中添加一个简单的保存/加载功能。因此,您应该将数据写入和读取到游戏保存文件中。您不应该修改某些文件的python代码!
- 是的,但是当您退出一个python文件时,它们会被设置回它们的默认值。即var1=string,在程序中将其更改为string1。退出程序时,它将变回字符串
- @pm2ring我该怎么做?
- 创建一个包含所需数据的数据文件。当程序启动时,它读取数据,这样它就可以将关键变量设置为它们的初始值。当你想保存游戏时,你就把这些关键变量的当前值写到文件中。如果数据很简单,您只需使用一个简单的文本文件即可。但是,如果事情很复杂,您可以使用某种结构化数据文件,比如JSON。另一种选择是使用pickle模块,该模块可以保存各种Python对象并将其重新加载。
- @PM2RING哦。好啊。
除非使用不推荐使用的eval或exec评估该字符串,否则这不会起作用。
据我所知,您在script2中有一个字符串,并且希望基于该字符串在script1中执行一个函数。您可以做的是定义一个字典,该字典包含您已映射到要调用的函数的字符串:
在脚本1中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #imports
from script2 import SaveCode
#Code
def Test():
print('Hello, World!')
functions = {
'Test': Test
}
# Assuming that SaveCode = 'Test' in your second script,
# look up the corresponding function
function_to_run = functions[SaveCode]
# and call it
function_to_run() # prints Hello, World! |
在脚本2中:
号
- 回溯(最近调用的最后一个):文件"c:csc1abprojects estscript1.py",第3行,位于from script2 import savecode file"c:csc1abprojects estscript2.py",第1行,位于functions[savecode]()name错误:未定义名称"functions"
- 第一个脚本中缺少functions = {...行
- 我把你答案中的所有内容都复制到2个脚本中
- @答案只显示脚本1。
- 阅读答案中的评论
- @蔡斯巴内斯:我在答案中没有看到任何东西表明你应该替换这两个脚本。不管怎样,这不是目的。
- 假设在第二个脚本中savecode='test',查找相应的函数并调用它
- 当我回到办公桌时,我会更新我的答案,以便更清楚地知道是否还有问题。
- @代码中的注释仅仅意味着我假设脚本2中有一个名为SaveCode的变量,它的值是'Test'。无论如何,我更新了代码来显示script1和script2的内容。
- @巴赫罗姆我有……
- @追巴恩斯和……你还有例外吗?有关脚本1和脚本2的内容,请参阅我编辑的答案。
- 不确定。。。。。。。