我终于进入了Python,并注意到一些奇怪的东西,在Java中工作,但不在Python中。
当我输入以下内容时:
fn = "" # Local filename storage.
def read(filename):
fn = filename
return open(filename, 'r').read()
我的Atke的flake8 linter给了我以下错误:
F841 - 本地变量' fn'被分配但从未使用过。
我假设这意味着变量是在 def 级别定义的,而不是模块级别,我打算这样做。如果我错了,请纠正我。
我使用多种措辞搜索了Google,但似乎无法用正确结果显示的方式对其进行搜索...
关于如何从功能级别实现模块级变量定义的任何想法?
答案 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()
会更加明确。