ValueError: 类型名称和字段名称必须是有效的标识符:namedtuple
ValueError: 类型名称和字段名称必须是有效的标识符:namedtuple
我在一个Flask视图函数中有以下代码(我使用的是Python 3.6):\n
@login_required @main.route('/dashboard', methods=['GET', 'POST']) def dashboard(): if request.method == 'POST': dash_data = namedtuple('dash_data', [('posting', str), ('folder', str)]) print(request.form.get('posting')) posted_data = dash_data(posting=request.form.get('posting'), folder=request.form.get('folder'))
\n我得到的错误信息是:\n
Traceback (most recent call last): File "...\lib\site-packages\flask\app.py", line 1997, in __call__ return self.wsgi_app(environ, start_response) ... ValueError: Type names and field names must be valid identifiers: "('posting',)"
\n我做错了什么?
问题原因:上述代码中的问题是在使用namedtuple时提供了一个包含(属性,类型)元组的列表作为参数,而namedtuple只接受属性的可迭代对象或单个字符串参数。
解决方法:要解决这个问题,可以将(属性,类型)元组的列表替换为属性的可迭代对象或单个字符串。可以通过下面两种方式实现:
方式一:
namedtuple('dash_data', ('posting', 'folder'))
方式二:
namedtuple('dash_data', 'posting folder')
如果需要更多关于如何使用namedtuple的信息,可以参考文档:https://docs.python.org/3/library/collections.html#collections.namedtuple。
该问题是在stackoverflow上的一个问题的回答中发现的:stackoverflow.com/questions/34269772。从问题的回答和评论中可以看出,这是一个关于类型提示的问题。
然而,上述回答是错误的。问题的真正解决方式是使用typing模块中的namedtuple版本,该版本接受一个包含(属性,类型)元组的列表作为参数。