匿名代码块

7 投票
4 回答
2447 浏览
提问于 2025-04-16 12:46

前言:

到目前为止,我一直在把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 个回答

3

你可以在每个代码块结束后,明确地删除你的变量,使用 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 语句。

8

如果我想模拟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”,所以这个代码块确实是匿名的。

3

不行。只有 classdef 这两种代码块,以及模块(在更新的版本中,还有列表推导和生成器表达式,但这里不适用)会引入一个新的作用域。而且只有类会直接执行。所以如果你想继续这种有争议的使用方式,你就得继续“滥用” class,或者定义函数并直接调用它们。每个计算用不同的文件来写在源代码层面上看起来稍微好一点,但如果计算总是那么简单,可能也不值得这么做。

撰写回答