gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:05:29 24 4
gpt4 key购买 nike

最近才开始学习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)

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

我曾考虑过在另一个函数中定义所有函数,但我认为我无法实现这些。我考虑过用装饰器“标记”每个函数,但我意识到每次调用函数时都会调用装饰器(如果我理解正确的话),而不是一次。

一段时间后我想到了这个解决方案:

(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)

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

也许我应该简单地接受一个不太优雅的解决方案,或者也许我没有以惯用的方式编写我的脚本。无论如何,欢迎任何意见和建议。

最佳答案

你误会了装饰器。它们在定义函数时被调用一次,然后它们返回的函数就是赋给函数名的值,每次调用的都是那个函数。您可以在装饰器中做您想做的事,而不会产生运行时开销。

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

PS:您可能根本不需要担心运行时开销。

PPS:您也在尝试优化奇怪的事情,最好只在文件中维护一个列表。您多久添加一次功能,并且考虑得很少?在源文件中更新列表并不困难。

关于动态定义静态定义函数列表的 Pythonic 优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11164286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com