1

統計計算のために、再利用できないスクリプトを書かなければなりません。彼らの文章は、「あらすじを見て、さらに5行追加/削除」のように見えます. 私には問題があります。コードが数画面スクロールになると、名前空間がループ本体に宣言された変数によって汚染されるため、コードを書くのが難しくなります。

Python ループはコード ブロックではないことはわかっています。Guido van Rossum は、サイクル本体を関数とメソッドに移動する必要があると考えています。しかし、私の場合、コードの変更は単純化されませんが、さらに難しくなります。

ループ本体としてダミーのクラス宣言を使用していますが、もっと良い方法をご存知でしょうか?

#what I use now

outer = 7, 40
for elm in outer:
    class Dummy:
        print elm * 2
        temp = elm * 3 #I don't want to see this outside my loops!

# print "temp", temp # should give error
4

2 に答える 2

2

グローバル名前空間からいつでも名前を削除できます。

outer = 7, 40
for elm in outer:
    print elm * 2
    temp = elm * 3

del temp

しかし実際には、関数を使用して特定のタスクを実行します。コードをより保守しやすく、読みやすくします。

于 2013-09-26T10:34:56.973 に答える
0

@Martjin の返信に基づいて、Matlab のワークパッドの提案に基づいて、期待できる代替ソリューションを次に示します。

ソリューション

>>> from Workpad import Workpad
>>> with Workpad() as workpad:
    for elm in outer:
        print elm * 2
        workpad.temp = elm * 3
        workpad.temp1 = workpad.temp / 2
        print workpad.temp, workpad.temp1


14
21 10
80
120 60
>>> workpad.temp

Traceback (most recent call last):
  File "<pyshell#335>", line 1, in <module>
    workpad.temp
AttributeError: Workpad instance has no attribute 'temp'

上記の作業を行うには、という名前のモジュールを 1 つ作成Workpad.pyし、インポート パスに配置する必要があります。

class Workpad:
    def __exit__(self, *args):
        for e in dir(self):
            if not e in self.__attribs and e != '_Workpad__attribs':
                delattr(self, e)

    def __enter__(self):
        return self
    def __init__(self):
        self.__attribs = dir(Workpad)

私がこのソリューションを気に入っている理由は、それが意図したこと、つまりスコープを作成することです。一般に、クラスまたは関数を使用してスコープを作成すると、複数のスコープをネストする必要がある場合、誤解を招き、面倒になる可能性があります。

于 2013-09-26T11:29:15.520 に答える