![](/img/trans.png)
[英]how to resolve this error File "test.py", line 5, in <module> for _ in range(b[0]): TypeError: 'int' object is not subscriptable
[英]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.