2

私はついに Python に取り掛かりましたが、 Javaでは動作するがPythonでは動作しないという奇妙なことに気付きました。

次のように入力すると:

fn = ""  # Local filename storage.

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

Atom の flake8 リンターで次のエラーが表示されます。

F841 - ローカル変数 'fn' が割り当てられていますが、使用されていません。

これは、変数がモジュールレベルではなく定義レベルで定義されていることを意味すると想定しています。私が間違っている場合は、私を修正してください。

複数の表現で Google を検索しましたが、正しい結果が表示されるように言葉にすることはできません...
関数レベルからモジュールレベルの変数定義を達成する方法についてのアイデアはありますか?

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 に答える