ここで実行しようとしているのは、グローバル変数をシミュレートすることです。
それをする正当な理由はありません。本当にグローバル変数が必要な場合は、明示的にグローバル変数にします。
アクセスするたびに1ずつ増加する単純なCounter
クラスを作成してから、そのグローバルインスタンスを作成できます。しかし、 DSMがコメントで説明してcount
いるように、標準ライブラリはすでにそのようなものを無料で提供しています。itertools.count
それで:
import itertools
_counter = itertools.count()
def make_screenshot_file(file_name):
order = next(_counter)
test_suites_path = _make_job_directory()
return make_writable_file(os.path.join(test_suites_path,'screenshot',file_name % order))
なぜこれがどれだけのストレージや時間を費やすのか心配しているのかわかりません。なぜなら、単一のオブジェクトに8バイトを使用しているか800バイトを使用しているかが問題になる可能性のあるプログラムは考えられないからです。複数あるか、またはアクセスするのに3nsまたは3usかかったかどうかは、ほんの数回しかアクセスできません。
しかし、ソースからわかるように、Cで実装されているのではないかと心配している場合は、かなりメモリ効率が高く、何もしなければ、基本的に1つで各数値を生成します。数行のコードを解釈するよりもはるかに少ないです。count
PyNumber_Add
あなたが尋ねたので、_count
クラス属性の代わりにクラス属性を使用することによって、既存のコードを根本的に単純化する方法は次の__counter_instance
とおりです。
class Counter():
_count = 0
def count(self):
Counter._count += 1
return Counter.count
もちろん、今Counter().count()
はただではなく、そうしなければなりません—しかし、それが重要な場合は、それCounter().count
を簡単に修正できます@property
。
It's worth pointing out that it's a really bad idea to use a classic class instead of a new-style class (by passing nothing inside the parens), and if you do want a classic class you should leave the parens off, and most Python programmers will associate the name Counter
with the class collections.Counter
, and there's no reason count
couldn't be a @classmethod
or @staticmethod
… at which point this is exactly Andrew T.'s answer. Which, as he points out, is much simpler than what you're doing, and no more or less Pythonic.
But really, all of this is no better than just making _count
a module-level global and adding a module-level count()
function that increments and returns it.