从函数定义模块变量

时间:2016-01-17 10:14:59

标签: function variables python-3.x scope flake8

我终于进入了Python,并注意到一些奇怪的东西,在Java中工作,但不在Python中

当我输入以下内容时:

fn = ""  # Local filename storage.

def read(filename):
    fn = filename
    return open(filename, 'r').read()

我的Atke的flake8 linter给了我以下错误:

  

F841 - 本地变量' fn'被分配但从未使用过。

我假设这意味着变量是在 def 级别定义的,而不是模块级别,我打算这样做。如果我错了,请纠正我。

我使用多种措辞搜索了Google,但似乎无法用正确结果显示的方式对其进行搜索...
关于如何从功能级别实现模块级变量定义的任何想法?

2 个答案:

答案 0 :(得分:1)

如果要将fn声明为全局变量(模块级别),请使用global statement

def read(filename):
    global fn  # <-----
    fn = filename
    return open(filename, 'r').read()

BTW,;是可选的。不要使用它。

答案 1 :(得分:1)

您可以通过执行以下操作设置模块级别变量:

import sys

def read(filename):        
    module = sys.modules[__name__]
    setattr(module, 'fn', filename)
    return open(filename, 'r').read()

然而,这是一个非常奇怪的必需品。考虑改变你的架构。

UPD:让我们考虑一个例子:

# module1
# uncomment it to fix NameError and AttributeError
# some_var = '' 

def foo(val):
    global some_var
    some_var = val


# module2
from module1 import *
print(some_var)  # raises NameError: name 'some_var' is not defined

foo('bar')
print(some_var)  # still raises NameError: name 'some_var' is not defined


# module3
import module1
print(module1.some_var)  # raises AttributeError: 'module' object has no attribute 'some_var'

foo('bar')
print(module1.some_var)  # prints 'bar' even without some_var = '' definition in the module1

因此,global在导入过程中的表现并不那么明显。我认为,在setattr(module, 'attr_name', value)通话期间手动执行read()会更加明确。