匿名代码块

时间:2011-03-01 19:20:06

标签: python

序:

到目前为止,我已经将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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

如果我想模拟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”指向“None”,因此代码块实际上是匿名的。

答案 2 :(得分: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

答案 3 :(得分: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语句。