2017-10-13 96 views
2

我有名称的模块my_module.py 这里面模块有一个函数my_function如何声明一个变量被导入模块使用

def myFunction(): 
    print my_variable 

显然,当这种函数被调用它打印my_variable它尚未实例化。所以,从模块内部调用myFunction()会导致执行崩溃。

现在,除了my_module.py我还有一个名为my_app.py的脚本位于同一个文件夹中。

my_app.py内部我正在导入my_module.py并在其名称空间下实例化my_variablemy_variable之后被实例化我打电话my_module.myFunction()它拿起my_variable并打印其背景的:

import module 
module.my_variable = 'this variable is instantiated inside of another script' 
module.myFunction() 

虽然这种方法我不知道如果设计得当。是否有其他方式来实例化imported module以外的变量以供此imported module使用?

+3

术语挑剔:Python并不变量声明。但无论如何,这听起来像你应该通过一个参数的功能,而不是依靠全球状态...... –

+0

当然。它通过名称来引用它们。 – alphanumeric

+0

我不确定你在这方面的含义。但不管怎么说,你已经在Python中声明了一个变量是不正确的。 –

回答

-1

我不确定你想达到什么目标,但是最好不要改变“全局”变量。每当你想在你的代码中使用my_function()时,你必须首先明确地改变my_variable,如果其他函数/方法依赖于代码,这会在代码中触发副作用。最好的办法是重写my_function(),使其接受my_variable作为参数

+0

我以'my_function()'为例。因此,解释起来相对简单。有时候我们需要一个全局范围变量。因此,每个被导入的模块都可以访问同一个对象或变量。 – alphanumeric

+0

例如,数据库连接对象可以共享为“真正”全局变量。假设程序中有几个模块需要数据库连接对象。当然,我们可以在每个模块中实例化DB连接对象。或者我们可以用这样的方式编写模块函数,使得它们将连接对象作为参数。但我认为这是很多工作。如果我们只是实例化一个数据库连接对象并使其可用于所有导入的模块,那将会非常简单。 – alphanumeric

+0

我太快读了你的问题。我想你没有改变任何东西,只试图在'my_module'之外实例化'my_variable',对吗?那么'my_function'没有干净的方式来知道它的包含范围之外的任何变量,它是'my_module'。当您执行'import my_module'时,您将'my_module'中的名称绑定到'my_app'。这意味着您可以从'my_app'中访问'my_module'中的所有名称,而不是相反。但是,它使用'__builtin__'进行破解,这非常危险。所以传递'my_variable'作为参数仍然是最好的方法。 – spidertothefly127

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

然后在my_module.py

import my_vars 

def myFunction(): 
    print my_vars.my_variable