带dict()的SyntaxError

2024-06-16 10:17:06 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图创造这个

self.cmds = {
             'help' : self.cmdsHelp,
             'write-start' : self.startWriter,
             'write' : self.writeTo,
             'read-start' : self.startReader,
             'read' : self.readFrom
            }

使用内置的dict()函数。。。i、 e

self.cmds = dict(
                 help = self.cmdsHelp,
                 write-start = self.startWriter,
                 write = self.writeTo,
                 read-start = self.startReader,
                 read = self.readFrom
                )

。。。我得到这个错误:

    write-start = self.startWriter,
                            ^
SyntaxError: keyword can't be an expression

带花括号({})的字典——不管是什么特别的名字——都能用,但我不明白为什么“新版本”(即dict()形式)不能用。有什么我不知道的吗,还是你只需要用大括号?你知道吗

为清楚起见:

字典中的每个值都是一个函数(是的,我确实删除了self.,而且我还尝试了self.function()function(),因此当我调用它时,我不必执行self.cmds[<input>](),而是可以执行self.cmds[<input>]


Tags: 函数selfread字典helpfunctionstartdict
1条回答
网友
1楼 · 发布于 2024-06-16 10:17:06

关键字参数必须是valid python identifiers。不能在有效标识符中使用-(而是尝试减去两个标识符)。dict()只是一个可调用函数,传递给它的关键字参数也不例外。你知道吗

改用{}文字dict语法:

self.cmds = {
    'help': self.cmdsHelp,
    'write-start': self.startWriter,
    'write': self.writeTo,
    'read-start': self.startReader,
    'read': self.readFrom,
}

因为这样就可以使用任何有效的不可变哈希值作为键。你知道吗

或者,使用有效的标识符;将-替换为_,这是标识符中允许的字符:

self.cmds = dict(
    help=self.cmdsHelp,
    write_start=self.startWriter,
    write=self.writeTo,
    read_start=self.startReader,
    read=self.readFrom,
)

任何其他替代方法都会很快变得难看;您可以使用dict literal语法生成**kwargs双splat关键字参数映射:

self.cmds = dict(
    help=self.cmdsHelp,
    write=self.writeTo,
    read=self.readFrom,
    **{
        'read-start': self.startReader,
        'write-start': self.startWriter,
    }
)

但这已经不可读了,是吗。你知道吗

您可以在以下情况之后设置这些非标识符键:

self.cmds = dict(
    help=self.cmdsHelp,
    write=self.writeTo,
    read=self.readFrom,
)
self.cmds['read-start'] = self.startReader
self.cmds['write-start'] = self.startWriter

但那更难看。你知道吗

注意,字典显示(official term for the syntax)对于解释器来说比dict()调用更快,因为用于构建一个字典的字节码指令更少,而且不涉及函数调用。你知道吗

相关问题 更多 >