![](/img/trans.png)
[英]How to make a function take variables from outside the function in 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.