【问题标题】:Using sys.argv to retrieve different functions使用 sys.argv 检索不同的函数
【发布时间】:2018-06-30 04:47:16
【问题描述】:

假设我有这些代码行:

if __name__ == '__main__':
if '-h' in sys.argv:
    show_help()
elif '-f' or 'function'in sys.argv:
    print(function1)
elif '-n'or '-name' in sys.argv:
    print(function2)
elif '-e' or '-extension'in sys.argv:
    print(function3])
elif '-m' or '-missing'in sys.argv:
    print(function4)
elif 'r' or '-range' in sys.argv:
    print(function5)
else:
    exit

这些字母应该是用户在 bash 终端中输入的。 显示帮助方法有效,它能够显示所有字符串。 -f 输入有效并显示了我在该函数中需要的内容,但是代码只是从函数 1 中吐出内容,而不是从函数 2 等等。

我如何获得这些不同的字母,-f、-n、-e、-m(如果输入)来执行该功能并吐出该信息? 还有一种更有效的方法可以在不使用 argparse 的情况下为初学者 Python 脚本编写者执行此操作吗?

【问题讨论】:

  • 你检查它是否在 sys.argv 中......当你通过 -n 时也是如此。使用 click ,与 argparse 相比相对简单
  • 我推荐 argparse 模块。 docs.python.org/2.7/library/argparse.html
  • 不要重新发明轮子。使用argparseclick
  • 作为python中的菜鸟,我想尝试一些更简单的东西。但会看看!

标签: python python-3.x argv sys


【解决方案1】:

要测试两个值中的任何一个是否在列表中,您不能将or 运算符与in 运算符一起使用。您需要使用in 运算符分别测试每个值,如下所示:

if '-h' in sys.argv:
    show_help()
elif '-f' in sys.argv or '-function' in sys.argv:
    print(function1)
elif '-n' in sys.argv or '-name' in sys.argv:
    print(function2)
elif '-e' in sys.argv or '-extension'in sys.argv:
    print(function3])
elif '-m' in sys.argv or '-missing'in sys.argv:
    print(function4)
elif '-r' in sys.argv or '-range' in sys.argv:
    print(function5)
else:
    exit

【讨论】:

  • 这太低效了,如果您要进行重复的收容检查,至少将参数转换为set
  • 如何为重复检查创建一个集合?
  • set(sys.argv)
  • @zwer 你不需要一套,你需要一本字典。这是一个更好的整体设计。
【解决方案2】:

我强烈建议使用 argparse

如果您不想这样做,也可以创建一个标志字典:

flags = {
    '-h': show_help, 
    '-f': function1,
    '-function': function1,
    '-n': function2,
    '-name': function2,
    '-e': function3,
    '-extension': function3,
    '-m': function4,
    '-missing': function4,
    '-r': function5,
    '-range': function5,
}
if __name__ == '__main__':
    for flag in sys.argv:
        print(flags[flag])

通过创建字典,您只需查找键即可。

它会产生更简洁、更快且更易于维护的代码。

【讨论】:

  • 谢谢。我完全忘记了创建字典而只使用 for 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多