带有dict()的SyntaxError

时间:2014-07-23 20:49:08

标签: python python-3.x dictionary syntax-error

当我尝试创建此

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

内置dict()功能......即

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>]

1 个答案:

答案 0 :(得分:6)

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

请改用{}文字字母语法:

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

因为那样你就可以使用任何有效的不可变的&amp;可用值作为键。

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

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

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

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

但是它不再具有可读性,是吗。

您可以在事实之后设置这些peskey非标识符键:

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()调用,因为使用较少的字节码指令来构建一个而没有函数打电话。