【问题标题】:Python 3.x: User Input to Call and Execute a FunctionPython 3.x:调用和执行函数的用户输入
【发布时间】:2017-12-14 12:17:42
【问题描述】:

有很多类似的问题,但没有一个答案能解决我的问题。

我已经定义了几个解析大型数据集的函数。首先,我调用数据,然后将数据(表示为 .txt 中的行和列)组织到列表中,我将为各个数据条目编制索引。之后,我建立了我的函数,这些函数将一次处理一个列表。代码如下:

f = open(fn)
for line in iter(f):

    entries = [i for i in line.split() if i]

    def function_one():
        if entries[0] == 150:
            # do something
    def function_two():
        if entries[1] == 120:
        # do something else
    def function_three():
        if len(entries) > 10:
        # do something else

等等。等等。

我试图提示用户询问他们想要执行什么函数,因为每个函数返回关于数据集的不同内容。我的尝试如下:

    f_call = input('Enter Function Name: ')
    if f_call in locals().keys() and callable(locals()['f_call']):
        locals()['f_call']()
    else:
        print('Function Does Not Exist')

当我运行脚本时,系统会提示我输入'Enter Function Name:',如果我输入'function_one' 并返回,则会提示prints'Function Does Not Exist'。我想看看,如果输入正确,脚本将只执行用户输入的函数。如果用户输入正确,该函数应该运行并print 解析的数据。

我也尝试使用dict 来存储函数,但没有成功。

任何帮助将不胜感激。

【问题讨论】:

  • 去掉if f_call in locals().keys() and callable(locals()['f_call'])中的“”
  • @tinySandy 如前所述,我未能成功应用建议副本中提供的字典解决方案。
  • 到底为什么要在循环中(重新)定义函数?让我们从那个开始......
  • @zwer 我的理解是,为了逐行处理数据集(15000 多行,可变列长度),必须使用 for iter 单独分析所有行。如果不是这样,我完全愿意接受其他建议。我对 Python 和整个编码都是全新的。

标签: python function parsing input data-structures


【解决方案1】:

根据您的 cmets,我认为您正在尝试实现以下目标:

def function_one(data):
    if data[0] == 150:
        pass  # do something

def function_two(data):
    if data[1] == 120:
        pass  # do something else

def function_three(data):
    if len(data) > 10:
        pass # do something entirely different

这定义了接受参数的函数,以便您以后可以重用它们。然后你想问用户在处理数据时使用哪个函数,所以:

while True:  # loop while we don't get a valid input
    user_function = input('Enter a function name to use: ')  # ask the user for input
    if user_function in locals() and callable(locals()[user_function]):  # if it exists...
        user_function = locals()[user_function]  # store a pointer to the function
        break  # break out of the while loop since we have our valid input
    else:
        print('Invalid function name, try again...')

最后,您可以加载您的文件,逐行读取,拆分并按用户决定的功能进行处理:

with open(file_name, "r") as f:
    for line in f:
        entries = line.split()  # no need to check for empty elements
        user_function(entries)  # call the user selected function and pass `entries` to it

当然,你可以在之后做进一步的处理。

更新 - 这是对上述代码的简单测试,给定文件 test_file.txt 包含:

标记化的第 1 行
标记化的第 2 行
标记化的第 3 行

file_name = "test_file.txt"在文件中定义,而函数定义为:

def function_one(data):
    print("function_one called: {}".format(data))

def function_two(data):
    print("function_two called: {}".format(data))

def function_three(data):
    print("function_three called: {}".format(data))

如果你执行代码,这是输出/跟踪:

输入要使用的函数名称:bad_name_on_purpose
函数名无效,重试...
输入要使用的函数名称:function_two
function_two 调用:['tokenized', 'line', '1']
function_two 调用:['tokenized', 'line', '2']
function_two 调用:['tokenized', 'line', '3']

【讨论】:

  • 从逻辑上讲,这对我来说更有意义。我已根据您的建议更新了我的代码,但是在运行代码时,没有打印任何内容。我的描述可能具有误导性,因为它没有指定我希望在每一行之后打印数据解析(假设条件满足),尽管这是我在函数中做的事情,所以我不确定为什么它不会工作。我觉得我在函数中放置的参数做错了什么。
  • @DRauch - 我在上面添加了一些测试代码来演示它是如何工作的。将其与您的设置进行比较,看看您是否缺少某些组件。如果您尝试比较单个值,请记住 str.split() 返回一个字符串列表,因此如果您想将它们与整数进行比较,您必须先将它们转换为整数(即​​if int(data[0]) == 150...
  • 我的 IDE 中显示的错误是“从外部范围阴影名称‘列’”。我认为我原来的 for 循环被改变的方式改变了数据的存储方式。为简单起见,我的完整代码将一些 entries 存储为新列表 column。所以我尝试使用column 作为所有函数的参数,但是当我运行脚本时我仍然一无所获。我觉得我的问题比上面问题中提出的问题要严重得多。
【解决方案2】:

要使您的代码正常工作,只需在调用时保留变量 f_call 不带 ''

f_call = input('Enter Function Name: ')
if f_call in locals().keys() and callable(locals()[f_call]):
    locals()[f_call]()
else:
    print('Function Does Not Exist')

【讨论】:

  • 仍然导致“功能不存在”
【解决方案3】:

这可能不是修复它的最有效方法,但您可以使用以下方法:

f_call = raw_input('Enter Function Name: ')
if f_call == "function_one":
    function_one()
if f_call == "function_two":
    function_two()
if f_call == "function_three":
    function_three()
else:
    print('Function Does Not Exist')

【讨论】:

  • 我也试过了。运行脚本时,会反复提示用户'Enter Function Name:',而不是实际运行已经输入的函数。
  • 那可能是因为你把它放在了循环里面。您将希望在创建函数后放置我的脚本,而不是在循环中。
  • 正确,但是如果我把它移出循环,当我输入函数名时什么也不会发生。
  • 可能先定义循环外的函数
  • 我使用 for 循环作为一种方法,逐行处理每一行,以便所选函数分析一行,然后分析下一​​行,依此类推......我被引导到相信这是遍历每一行的正确方法。如果这不正确,请告诉我。我仍然是初学者,因此非常感谢任何建议。
猜你喜欢
  • 2020-10-15
  • 2019-03-17
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多