簡體   English   中英

ArgParse錯誤。 但在Test.py文件中工作

[英]ArgParse ERROR. but working in Test.py file

我在create_assessment (和所有CRUD操作)中的test.py文件正在工作,例如,填充我創建的database 但是,由於與category區域有關,使與數據庫交互的ArgParse命令行在create_assessment失敗。 Assessment Category共享多對多關系

我認為問題出在解析器的category行(如TracebackError所示,但我無法弄清楚這個難題。 categories確實存在於db ,解析器無法識別類別,但可以識別類別test.py文件,可能是args = parser.parse_args()無法正確解析。

錯誤:

(venv)acks-MacBook-Pro:notssdb ack$ notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady 'movie' ['Bats', 'Development', 'Swinging at nothing']
usage: API_ArgParse [-h]
                    {create_user,retrieve_user,update_user,update_user_lastname,delete_user,create_assessment,retrieve_assessment,update_assessment,delete_assessment,create_video,retrieve_video,update_video,update_video_url,delete_video,create_category,retrieve_category,update_category,delete_category,create_element,retrieve_element,update_element,delete_element,create_assessment_results,retrieve_assessment_results,delete_assessment_results,create_category_rating,retrieve_category_rating,update_category_rating,delete_category_rating,create_element_rating,retrieve_element_rating,update_element_rating,delete_element_rating,create_comment,retrieve_comment,update_comment,delete_comment}
                    ...
API_ArgParse: error: unrecognized arguments: Development, Swinging at nothing]

添加解析器=配置。

碼:

parser = argparse.ArgumentParser(prog='API_ArgParse', description='Create, Read, Update, and Delete (CRUD) Interface Commands for NOTSSdb')
subparsers = parser.add_subparsers(dest='cmd', title='subcommands', description='type subcommand name with -h for more details : e.g. notssdb-cmd create_user -h', help='additional help')
api = ConvenienceAPI() 

# Create command for 'assessment'  
create_parser = subparsers.add_parser('create_assessment', help='create an assessment')
create_parser.add_argument('name', type=str, help='name of the assessment')
create_parser.add_argument('text', type=str, help='assessment text')
create_parser.add_argument('username', type=str, help='name of user')
create_parser.add_argument('videoname', type=str, help='name of video')
create_parser.add_argument('category_names', type=str, help='list all category names')#THIS LINE

# Parse the arguments
args = parser.parse_args()

api = ConvenienceAPI()
api_method = getattr(api, args.cmd)
arg_dict = vars(args)
del arg_dict['cmd']
api_method(**arg_dict)

具有類別檢索功能的Create_assessment方法(convenience.py-繼承基礎):

class ConvenienceAPI(BaseAPI):          

    def create_assessment(self, name, text, username, videoname, category_names):
        user = self.retrieve_user(username)
        video = self.retrieve_video(videoname) 
        cat_objects = [self.retrieve_category(category_name) for category_name in category_names]
        return super(ConvenienceAPI, self).create_assessment(name, text, user, video, cat_objects) 

檢索類別(base.py)的方法:

def retrieve_category(self, something_unique):
    if isinstance(something_unique, int):
        return self.session.query(Category).\
        filter(Category.category_id == something_unique).all() # multiple categories
    elif isinstance(something_unique, basestring):
        print(something_unique) # added 
        return self.session.query(Category).\
        filter(Category.category_name == something_unique).one()

工作的test.py文件示例:

api.create_assessment('How to be a leader', 'better decisions', 'wizard', 'good leadership', ['Leadership', 'Decision-Making', 'Teamwork and Communication', 'Situation Awareness'])

問題是放在方括號中的東西。 外殼中的壓線處理器無法識別它們。 查看解析所使用的sys.avgv

使用僅回顯argv的簡單腳本,您的行將產生:

['echoargv.py', 'create_assessment', 'Learning new things', 'this',
   'dancinglady', 'movie', '[Bats,', 'Development,', 'Swinging at nothing]']

請注意錯誤消息中的2個字符串:

'Development,'
'Swinging at nothing]'

位置“ category_names”為'[Bats,' ,但沒有放置其他字符串的位置。

在方括號"['Bats', 'Development', 'Swinging at nothing']"加上多余的引號可以解決此問題,但將整個內容分配給“ category_names”。 然后,您必須剝離並解析它。

另一個選擇是給'category_names'一個nargs='+'參數,然后輸入

notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady 'movie' 'Bats', 'Development', 'Swinging at nothing'

您不能在bash使用Python列表語法來傳遞列表。 您的程序正在傳遞以下字符串參數:

  • Learning new things
  • this
  • dancinglady
  • movie
  • [Bats,
  • Development,
  • Swinging at nothing]

如果要為category_names多個值,則需要以下參數last定義。

create_parser.add_argument('category_names',
                           dest='cmd',  # since you are trying to access args.cmd later
                           nargs='+',   # need at least one, use * if not required
                           help='list all category names')

然后用

$ notssdb-cmd create_assessment 'Learning new things' 'this' dancinglady \
    'movie' 'Bats' 'Development' 'Swinging at nothing'

前5個自變量被分配給前5個定義的參數。 由於所有剩余參數都是由nargs='+'定義的,因此將其作為列表分配給最終參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM