跨多个文件操作和导入全局变量

时间:2017-11-27 21:39:05

标签: python python-3.x global-variables

我正在尝试用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 + ".")

3 个答案:

答案 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)的引用类似。

一个例子:

params.py

# Variable declarations with some default value.
name = ''
somevar = 0
somevar2 = None

functions.py

import params

def setup():
#Sets up the player's stats.
    params.name = input("What is your name? ").capitalize()

main.py

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'
>>>