【问题标题】:How to iterate through modules with user input [closed]如何使用用户输入迭代模块[关闭]
【发布时间】:2014-02-24 13:10:31
【问题描述】:

一个用户输入模块,它遍历导入的模块,如图所示。我怎样才能让它遍历所有导入的模块,因为它只遍历 foo

from packageA import foo # has open_book() function
from packageB import bar# has read_music() function
from packageC import loader# has loader() function
import re
import sys
import difflib

def search():
    name = input('Please enter your query: ').lower().split()

    while True:    
        for name in ["open_book","read_music","loader"  ]:  #help code here          
            getattr(foo, "open_book")()
            getattr(bar, "read_music")()
    else:        
        print ('Try again')

【问题讨论】:

  • 您预计会发生什么?您的代码还可以在此处访问bar.read_music()。您想调用所有 3 个模块上的 3 个名称吗?
  • 如果您的 3 个模块有 3 个不同的功能,为什么不直接使用 foo.open_book()bar.read_music()loader.loader()?例如。直接引用方法?为什么它必须动态发生?
  • @Martijn,是的,可以调用所有三个不同的模块。使用名称(用户输入)是遍历这三个并按照 sn-ps 中编程的方式输出
  • 这并没有回答我的问题,不是真的。完全不清楚您要在这里做什么。
  • 我这里没有 foo、bar 或 loader 模块 sn-ps,但有用户输入,例如'open book',它将遍历所有三个搜索将输出答案的那个

标签: python function python-3.x getattr


【解决方案1】:

如果您想让用户输入可能在这 3 个模块上可用的任何函数名称,请将所有 3 个模块存储在列表或元组中并循环遍历,然后测试该函数是否可用:

modules = (foo, bar, loader)

def search():
    name = input('Please enter your query: ').lower()

    for module in modules:
        function = getattr(module, name, None)
        if function is not None:
            function()
            break

    else:        
        print ('Try again')

【讨论】:

  • 您好,感谢您的意见。我的意思是用户输入不一定调用模块名称,而是输入一个字符串,其中包含一个遍历模块的关键字。
  • 这毫无意义。你能用一些用户输入和预期行为/输出的例子来更新你的问题吗?
  • 用户输入会像“请打开书”,这会遍历模块到选择关键字并打开书的模块。例如在 foo 模块中,如果在 name(user input)..code 中打开书籍以打开书籍。例如,我正在研究每个模块以便能够选择特定的书籍,但我只需要解决这个问题
  • 使用该信息更新您的问题。不过,自然语言处理是一个广泛的主题。
猜你喜欢
  • 2018-10-28
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
相关资源
最近更新 更多