Pythonic,优雅的方式动态定义静态定义的函数列表?

Lan*_*aru 4 python scripting static dynamic

我最近才开始学习Python.让我解释一下我想要实现的目标.我有这个.py脚本,基本上有几个函数(硬编码到脚本中),所有这些都需要添加到单个列表中,这样我就可以通过简单地使用索引运算符获得我需要的函数,如下所示:

needed_function = function_list [needed_function_index]

我第一次尝试实现这一点导致了以下代码结构:

(imports)
function_list = []
(other global variables)

def function_0 = (...)
function_list.append(function_0)

def function_1 = (...)
function_list.append(function_1)

def function_2 = (...)
function_list.append(function_2)

(rest of code)
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这个解决方案,因为它不是很优雅.我的目标是能够简单地将函数定义添加到脚本中(没有追加调用),脚本会自动将其添加到函数列表中.

我曾想过在另一个函数中定义所有函数,但我认为我不会随意使用这些函数.我想过可能用装饰器"标记"每个函数,但我意识到每次调用函数时都会调用装饰器(如果我理解它们),而不是只调用一次.

过了一段时间我想出了这个解决方案:

(imports)
(global variables)

def function_0 = (...)

def function_1 = (...)

def function_2 = (...)

function_list= [globals()[x] for x in globals() if re.match('^function_[0-9]+$', x)]

(rest of code)
Run Code Online (Sandbox Code Playgroud)

我更喜欢它作为一个解决方案,但我唯一的问题是,出于清洁的目的,我宁愿在脚本的顶部完全定义function_list.但是,我不能这样做,因为在脚本顶部调用globals()将不包含函数,因为它们尚未定义.

也许我应该只是满足于一个不太优雅的解决方案,或者我可能不会以惯用的方式编写我的脚本.无论如何,任何意见和建议都表示赞赏.

Ned*_*der 8

你错了装饰师.它们在定义函数时被调用一次,它们返回的函数就是赋值给函数名的值,它是每次调用的函数.您可以在装饰器中执行您想要的操作而不会产生运行时开销.

my_functions = []

def put_in_list(fn):
    my_functions.append(fn)
    return fn

@put_in_list
def function1():
    pass

@put_in_list
def function2():
    pass
Run Code Online (Sandbox Code Playgroud)

PS:无论如何,您可能不需要担心运行时开销.

PPS:你也试图优化奇怪的东西,你可能最好只是在你的文件中维护一个列表.您多久添加一次功能,并且思考的程度如何?在源文件中更新列表并不困难.