ValueError: 类型名称和字段名称必须是有效的标识符:namedtuple

7 浏览
0 Comments

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我做错了什么?

0
0 Comments

出现问题的原因是在使用namedtuple时,类型名称和字段名称必须是有效的标识符。解决方法是使用typing模块中的NamedTuple。可以按照以下方式使用:

from typing import NamedTuple
dash_data = NamedTuple('dash_data',[('posting', str), ('folder', str)])

通过使用typing模块中的NamedTuple,我们可以避免ValueError: Type names and field names must be valid identifiers: namedtuple的问题。

0
0 Comments

问题原因:上述代码中的问题是在使用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版本,该版本接受一个包含(属性,类型)元组的列表作为参数。

0