2011-03-01 62 views
5

前言: 到目前为止,我已经使用python作为全面的编程语言。现在我喜欢用它来记录一些笔记(注释)和一些计算(python代码)(我实际上使用emacs并将当前缓冲区一次又一次地发送到正在运行的ipython实例)。匿名代码块

问题:我喜欢在同一个文档中多次重复使用一些常见变量名称,例如'A'或'd',而不会遇到我不小心忘记将值重新分配给其中一个变量名称的问题。

我到目前为止滥用类声明

# Topic one: bla bla 
class _anon: 
    d = 10 
    A = d**2 * pi /4 

# Topic two: bla bla 
class _anon: 
    A = d**2 * pi /4 # error is raised since d is missing 

这工作,因为一个类的语句创建它可以作为一个变量的作用域的执行框架,但我不知道是否有这个用例的专用语法。

回答

3

不,只有classdef块和模块(以及更新版本,列表解析和生成器表达式 - 尽管这里不适用)引入了一个新的范围。只有类直接执行。所以如果你想继续讨论这个有争议的Python使用,你必须坚持滥用class,或者定义函数并直接调用它们。对于每个计算使用不同的文件在源代码级别稍微不那么难看,但是如果计算总是很小,则可能不值得。

+0

我猜对了。感谢您的确认。 – 2011-03-01 20:29:14

2

globals.clear()几乎作品:

>>> a = 5 
>>> b = 6 
>>> a 
5 
>>> b 
6 
>>> globals().clear() 
>>> a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'a' is not defined 
>>> b 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'b' is not defined 

的问题是,它会吹走一切,包括像globals自己有用的东西!如果你尝试做globals.clear()第二次,你会看到:

>>> globals.clear() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'globals' is not defined 

为了解决这个,看http://bytes.com/topic/python/answers/34902-how-clean-python-interpreters-environment#post129239

但是如果我要这么多麻烦弯曲的Python应运而生的计算引擎,我可能想知道是否有更好的工具用于GNU Octave之类的目的。

+0

哦,我不知道那个:D但是我有一些全局参数,我用在所有计算中。尽管这在交互式ipython会话中当然是有用的。 +1 – 2011-03-01 19:35:37

+0

刚刚用ipython试过了,那里globals.clear()不会自杀。它按照你的意图工作。 – 2011-03-01 19:45:23

+0

我对matlab很流利,我不知道matlab在函数旁边有匿名代码块。我想对于Octave来说也是如此,因为它意味着要放弃替代matlab。 – 2011-03-01 19:49:20

2

你总是可以明确删除值每块后,用del

d = 10 
A = d**2 * pi /4 
(...) 
del d, A 

# Topic two: bla bla 

A = d**2 * pi /4 # error is raised since d is missing 

“显式优于隐式”。 “可读性计数”。 “应该有一个 - 而且最好只有一个 - 明显的方法来做到这一点。”

如果你想要花哨的东西,如果一个“单字母变量”活着“离它创建的点太远”的话,可能会使单元测试失败,该测试使调试跟踪能够进行验证。这样你就不会忘记添加del声明。

+1

一个有效的答案。那就是我在matlab脚本中所做的。但这很容易出错。我被C++的块所宠坏。 – 2011-03-01 20:14:32

2

如果我想模拟C/C++块,这通常是卓有成效的:

def _anon(): 
    d = 10 
    A = d**2 * pi /4 
_anon() 

这些 “块” 能够被嵌套。


如果一小片的初始样板是可以接受的,你也可以使用一个装饰调用的函数:

def block(function): 
    function() 

现在你没有重复的名字:

@block 
def _anon(): 
    d = 10 
    A = d**2 * pi /4 

请注意,函数装饰器通常会返回一个函数,但这不是。结果是执行代码后名称“_anon”指向“无”,所以代码块实际上是匿名的。