Python 从argparse调用方法

Python 从argparse调用方法,python,argparse,Python,Argparse,我有下面的Python代码,我试图调用方法genres()、scents()、films(),当argparse在main()中触发时,我在Wiki和堆栈中的主题中读到,它可以通过使用action=和const=来实现,但我的代码工作不正常。这个想法是这样的: python myApp.py--genres“Foo”将给出genres()名称“Foo” python myApp.py——剧集“Bar”“Foobar”将给出剧集()字符串“Bar”“Foobar” 因此,从这些方法中,我将调用另一

我有下面的Python代码,我试图调用方法
genres()、scents()、films()
,当argparse在
main()
中触发时,我在Wiki和堆栈中的主题中读到,它可以通过使用
action=
const=
来实现,但我的代码工作不正常。这个想法是这样的:

python myApp.py--genres“Foo”
将给出
genres()
名称
“Foo”

python myApp.py——剧集“Bar”“Foobar”
将给出
剧集()
字符串
“Bar”“Foobar”

因此,从这些方法中,我将调用另一个包中的方法,这些方法将发挥所有的魔力

#!/usr/bin/env python
#coding: utf-8

import argparse

def genres():
    print("Gotcha genres!")

def episodes():
    print("Gotcha episodes!")

def films():
    print("Gotcha films!")

def main():
    ap = argparse.ArgumentParser(description = 'Command line interface for custom search using themoviedb.org.\n--------------------------------------------------------------')
    ap.add_argument('--genres', action = 'store_const', const = genres, nargs = 1, metavar = 'ACT', help = 'returns a list of movie genres the actor worked')
    ap.add_argument('--episodes', action = 'store_const', const = episodes, nargs = 2, metavar = ('ACT', 'SER'), help = 'returns a list of eps  where the actor self-represented')
    ap.add_argument('--films', action = 'store_const', const = films, nargs = 3, metavar = ('ACT', 'ACT', 'DEC'), help = 'returns a list of films both actors acted that decade')

    op = ap.parse_args()
    if not any([op.genres, op.episodes, op.films]):
        ap.print_help()
        quit()

if __name__ == '__main__':
    main()

argparse
模块设计用于解析命令行参数和选项,并将它们放入方便的数据结构中(
op
)。一旦完成了这项工作,
argparse
基本上是不可能的,您需要以通常的方式编写常规Python代码

def main():
    # The code you already have...

    if op.genres: genres(op.genres)

def genres(gs):
    # Do stuff with the genres...

虽然从技术上讲,您可以编写代码,使
parse_args
方法直接调用任意参数的任意代码,但这通常不是最好的操作方法。这种方法很好,但不是最好的方法。使用
action=
更好,我只需要知道如何使用它@胡安:你为什么说使用动作更好
argparse
旨在将命令行参数转换为程序其余部分可以轻松使用的格式。它不应该调用程序本身的其余部分。@Juan我想你错了。阅读
action
属性的argparse文档:每个内置操作都只关注一件事——如何在数据结构中存储命令行信息。是的,您可以创建自定义操作来执行任何操作。但是为什么这会比普通的Python代码更好呢?@Juan:您需要使用
\uuuu调用\uuu
方法编写一个自定义操作类。您将编写更多的代码,更复杂,并失去对代码功能的控制。假设您需要根据两个参数的值执行某些操作<代码>动作无法处理;它只看到一个论点<代码>行动确实不是答案。