簡體   English   中英

Python:如何使在循環中聲明的變量從外部不可見?

[英]Python: how to make variables declared in loops be invisible from outside?

我必須編寫不可重用的腳本進行統計計算。 他們的作品看起來像“凝視地塊,並增加/刪除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

您始終可以再次從全局名稱空間中刪除名稱:

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

del temp

但實際上,可以使用函數來完成特定任務。 會使你的代碼更易於維護,更易於閱讀。

根據@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'

要完成上述工作,您需要創建一個名為Workpad.py模塊並將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)

我喜歡這種解決方案的原因是,它可以完成預期的工作,即創建一個作用域。 通常,如果您需要嵌套多個作用域,則使用類或函數創建作用域可能會產生誤導和麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM