2

我终于开始接触 Python,并注意到一些奇怪的东西,它适用于 Java,但不适用于 Python

当我键入以下内容时:

fn = ""  # Local filename storage.

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

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

F841 - 局部变量 'fn' 已分配但从未使用过。

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

我用多种措辞搜索了谷歌,但似乎无法以显示正确结果的方式来表达它......
关于我如何能够从功能级别实现模块级变量定义的任何想法?

4

2 回答 2

1

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

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

顺便说一句,;是可选的。不要使用它。

于 2016-01-17T10:30:44.857 回答
0

您可以通过执行以下操作从函数中设置模块级变量:

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()更清楚。

于 2016-01-17T10:32:05.343 回答