hoge関数への影響は、引数の入力のみに依存するような仕様にしたいためです。
他で定義したモジュール、関数やクラスも使えなくなりますが、
そのような仕様で大丈夫ですか?
python
1def no_globals(func):
2 import types
3 return types.FunctionType(func.__code__, {}, func.__name__)
4
5
6aaa = 1
7
8@no_globals
9def hoge(b):
10 c = aaa + b
11 return c
12
13hoge(1) # NameError: name 'aaa' is not defined
問題点: 外部の関数、クラス、モジュールも使えなくなる。
Pythonでは関数等も変数に格納されるオブジェクトです。
FunctionTypeの第二引数に許可するグローバル変数の辞書を与えることで回避できますが、
不用意に使われるグローバル変数の抑制にはなりません。変数辞書の管理が発生します。
※ 複雑になるのでコードは割愛しますが、
「外部の変数」がネストした関数内で作られる変数を参照する場合は、
グローバル変数ではなくクロージャです。
質問の意図としては、グローバル変数を全て禁止ではなく、
グローバル変数の乱用を抑制したいのだと思うので、
どちらかというと実行時のエラーよりも
コーディング規約や静的検査ツールで対応すべきだと思います。
解決策、提案できるとしたらプロジェクトの運用方法での対策
- 定数は大文字のみにする。mypy での定数宣言、等のコーディング規約の導入。
- コーディング規約を検査するコードの静的検査ツールの導入
- コードレビューの実施 (github 等を使っていれば、プルリクエスト時にレビューするような運用方法を決める)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/06 09:08
2020/12/06 10:42 編集