Python 如何声明导入模块要使用的变量
我有一个名为my_module.py的模块 此模块内部有一个函数Python 如何声明导入模块要使用的变量,python,Python,我有一个名为my_module.py的模块 此模块内部有一个函数my\u函数: def myFunction(): print my_variable 显然,当调用此函数时,它会打印尚未在任何地方实例化的my_变量。因此,从模块内部调用myFunction()将导致执行崩溃 现在,除了my_module.py之外,我还有另一个名为my_app.py的脚本驻留在同一文件夹中 在my_app.py内部,我正在导入my_module.py并在其命名空间下实例化my_变量。实例化my_变量后,
my\u函数
:
def myFunction():
print my_variable
显然,当调用此函数时,它会打印尚未在任何地方实例化的my_变量
。因此,从模块内部调用myFunction()
将导致执行崩溃
现在,除了my_module.py
之外,我还有另一个名为my_app.py
的脚本驻留在同一文件夹中
在my_app.py
内部,我正在导入my_module.py
并在其命名空间下实例化my_变量。实例化my_变量
后,我调用my_module.myFunction()
,它将拾取my_变量
并打印其上下文:
import module
module.my_variable = 'this variable is instantiated inside of another script'
module.myFunction()
虽然这种方法有效,但我想知道它是否设计得当。是否有其他方法来实例化导入模块之外的变量,以供此导入模块使用?我不确定您试图实现什么,但通常最好不要变异“全局”变量。每次您想在代码中使用my_function()
时,都必须先显式更改my_变量
,如果其他函数/方法依赖它,这可能会触发代码中的副作用。最好的方法是重写my\u函数()
,以便它接受my\u变量作为参数
import module
module.my_variable = 'this variable is instantiated inside of another script'
module.myFunction()
虽然这种方法有效,但我想知道它是否设计得当
不,这不是正确设计的。一种正确的方法是显式地将值传递给函数
是否有其他方法来实例化导入模块外部的变量以供此导入模块使用
在声明此变量时,只需使用另一个模块。例如my_vars.py
:
my_variable = 'this variable is instantiated inside of another script'
import my_vars
def myFunction():
print my_vars.my_variable
然后在my_module.py
中:
my_variable = 'this variable is instantiated inside of another script'
import my_vars
def myFunction():
print my_vars.my_variable
术语挑剔:Python没有变量声明。但无论如何,听起来你应该把一个参数传递给函数,而不是依赖于全局状态……当然。而是用名字来引用它们。我不知道你在这里的意思。但是不管怎样,说你已经在Python中声明了一个变量是不对的,但是不管怎样,答案是否定的,Python没有真正的全局范围——很多人会认为这是一个好的东西——而“全局”范围实际上是模块级的范围。因此,事情保持相对简单的解释。有时我们需要一个全局范围变量。因此,导入的每个模块都能够访问相同的对象或变量。例如,数据库connecton对象可以作为“真正的”全局变量共享。假设程序中有几个模块需要DB连接对象。当然,我们可以在每个模块中实例化DB连接对象。或者,我们可以以这样的方式编写模块函数,它们将连接对象作为参数。但依我看,这是一项艰巨的工作。如果我们只实例化一个DB连接对象并使其可用于所有导入的模块,那么会简单得多。我猜您没有进行任何变异,只是试图在my_模块
之外实例化my_变量
,对吗?当然,my\u函数
无法清楚地知道其包含范围之外的任何变量,即my\u模块
。当您导入my_模块时,您将把my_模块中的名称绑定到my_应用程序中。这意味着您可以从my_app
访问my_模块
中的所有名称,而不是相反。然而,有一个黑客在它周围使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,这是非常危险的。因此,将my_变量
作为参数传递仍然是最好的方法。但是,如果不编写函数以接受DB对象作为参数,则必须使用\uuuuu builtin\uuuuu
使DB对象可用于所有导入的作用域,这也是一种非常危险的方法。