我正在尝试用Python创建一个程序,并在名为“functions.py”的文件中声明我的所有函数。在“main.py”文件中,我使用
from functions import setup
调用“setup”功能。但是,每当我运行该文件时,我都会出现“name”不存在的错误。我不确定错误是什么。我已经做了一些关于在文件中使用全局变量的阅读,这就是我提出的“functions.name”,它也是行不通的。我本身并不是在寻找解决方案,但我真的想知道在文件中导入和操作变量的最佳方法是什么,因为我附加的代码只是实际设置函数的一小部分,主要代码。
functions.py
def setup():
#Sets up the player's stats.
global name
name = input("What is your name? ").capitalize()
main.py
setup()
print ("Welcome " + functions.name + ".")
答案 0 :(得分:1)
解决方案本身是改变导入的工作方式:
import functions
functions.setup()
print(Welcome " + functions.name + ".")
但是我担心如果你采用这种方法,你的多文件程序就会像单文件程序一样令人困惑。
更广泛的解决方案是尽可能避免全局变量。也许设置可以返回它创建的任何内容,然后它的调用者可以决定如何处理它:
def setup():
return input("What is your name? ").capitalize()
和
name = functions.setup()
print("Welcome " + name + ".")
或者,如果setup()
还有更多工作要做,而不仅仅是发现玩家的名字,请试试这个:
# functions.py
class Player:
# Fill this in later as you refine your design
pass
def setup():
player = Player()
player.name = input("What is your name? ").capitalize()
# player.score = ...
# player.charm = ...
# etc
return player
和
import functions
player = functions.setup()
print("Welcome " + player.name + ".")
答案 1 :(得分:1)
跨多个脚本共享变量的一种方法是将它们保存在一个单独的脚本中,除了保留这些变量之外什么都不做。您可以参考myscript.myvar
来引用每个变量。它与类变量(Myclass.classvar
/ self.classvar
)或导入函数(例如np.array)的引用类似。
一个例子:
# Variable declarations with some default value.
name = ''
somevar = 0
somevar2 = None
import params
def setup():
#Sets up the player's stats.
params.name = input("What is your name? ").capitalize()
import params
from functions import setup
setup()
print ("Welcome " + params.name + ".")
你叫什么名字? morble
欢迎Morble。
您几乎已经完成了这项工作,但却错过了“未打包”的内容。变量声明。如果你在函数中声明name,但在任何def之外声明并完整地导入脚本,它也可能有效,但我认为'推荐'方法是使用单独的脚本。
上述方法的不同之处在于params保持对这些变量的引用。在函数中,name
在函数返回时丢失,因为没有更多的引用。
答案 2 :(得分:0)
如果您想拥有包级变量,则必须在包级别创建它:
name = ""
def setup():
#Sets up the player's stats.
global name
name = input("What is your name? ").capitalize()
现在您可以访问变量:
>>> from functions import setup
>>> setup()
What is your name? Ivan
>>> functions.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'functions' is not defined
>>> import functions
>>> functions.name
'Ivan'
>>>