如何在Python3中显示和选择函数?

2024-09-29 01:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有两个Python3脚本:chooseFunc.pytestFuncs.py

我的目标是在前一个脚本中编写一个函数chooseFunction,然后导入该函数以便在后一个脚本中使用。在执行testFuncs.py中的chooseFunction()时,它应该显示testFuncs.py中存在的函数,并允许用户选择要运行的func()func没有args用于手头的目的

我创建了一个函数chooseFunction,如下所示:

def chooseFunction(module):
    funcList = []

    for key, value in module.__dict__.items():
        if callable(value) and value.__name__ !='<lambda>' and  value.__name__ !='chooseFunction':
            funcList.append(value)

    for funcIdx, myFunc in enumerate(funcList):
        print(funcIdx, myFunc.__name__ )

    chosenIdx = int(input('Choose function... ·\n'))

    return funcList[chosenIdx]()

当前,在testFuncs.py中执行时,如下所示:

from chooseFunc import chooseFunction
import sys

def func1():
    print('func1')

def func2():
    print('func2')

chooseFunction(module=sys.modules[__name__])

必须提供最后一行的参数module=sys.modules[__name__]

如何更改此行为,以便chooseFunction检索testFuncs.py中存在的函数列表,而不必提供上述module参数

对于任何潜在的不一致提前道歉,这是我在堆栈交换上的第一个条目。。。感谢您的反馈


Tags: 函数namepy脚本forvaluedefsys
1条回答
网友
1楼 · 发布于 2024-09-29 01:30:36

不完全符合您需要的规范(即,这只是一个1文件解决方案):

可以使用^{}获取global symbol table,并生成一个列出所有^{}函数的iterable

作为字典:

funcs = {k:v for k, v in list(globals().items()) if callable(v)}

或作为列表:

funcs = [v for _,v in list(globals().items()) if callable(v)]

示例用途:

# functions.py

def func1(msg):
    print("This is func 1: " + msg)

def func2(msg):
    print("This is func 2: " + msg)

def func3(msg):
    print("This is func 3: " + msg)

if __name__ == '__main__':

    funcs = [v for _,v in list(globals().items()) if callable(v)]

    # Prompt user for choice
    print("Choose function to run:")
    for i, f in enumerate(funcs):
        print('\t[{:d}] {:s}'.format(i+1, f.__name__))
    user_choice = int(input('\n>>> ')) - 1

    # Run the function
    funcs[user_choice]('hello there')

终端输出:

$ python functions.py
Choose function to run:
    [1] func1
    [2] func2
    [3] func3

>>> 2
This is func 2: hello there

相关问题 更多 >