带有dict()的SyntaxError

dyl*_*nmc 0 python dictionary syntax-error python-3.x

当我尝试创建这个

self.cmds = {
             'help' : self.cmdsHelp,
             'write-start' : self.startWriter,
             'write' : self.writeTo,
             'read-start' : self.startReader,
             'read' : self.readFrom
            }
Run Code Online (Sandbox Code Playgroud)

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

self.cmds = dict(
                 help = self.cmdsHelp,
                 write-start = self.startWriter,
                 write = self.writeTo,
                 read-start = self.startReader,
                 read = self.readFrom
                )
Run Code Online (Sandbox Code Playgroud)

...我收到此错误:

    write-start = self.startWriter,
                            ^
SyntaxError: keyword can't be an expression
Run Code Online (Sandbox Code Playgroud)

带有大括号({})的字典- 无论是什么特殊名称 - 都有效,但我无法理解为什么"较新版本"(dict()表单)不起作用.有什么东西我错过了,或者你只需​​要使用花括号?

为清楚起见:

字典中的每个值都是一个函数(是的,我确实删除了self.,我也尝试过这两个self.function(),function()所以当我调用它时,我不必这样做,self.cmds[<input>]()但我宁愿这样做self.cmds[<input>])

Mar*_*ers 6

关键字参数必须有效的python标识符.您不能使用-有效的标识符(您试图减去两个标识符).dict()只是一个可调用的,传递给它的关键字参数也不例外.

请改用{}文字dict语法:

self.cmds = {
    'help': self.cmdsHelp,
    'write-start': self.startWriter,
    'write': self.writeTo,
    'read-start': self.startReader,
    'read': self.readFrom,
}
Run Code Online (Sandbox Code Playgroud)

因为那样你就可以使用任何有效的不可变和可散列值作为键.

或者,使用有效的标识符; 替换-_,一个字符允许在indentifiers:

self.cmds = dict(
    help=self.cmdsHelp,
    write_start=self.startWriter,
    write=self.writeTo,
    read_start=self.startReader,
    read=self.readFrom,
)
Run Code Online (Sandbox Code Playgroud)

任何其他选择变得丑陋真实; 您可以使用dict文字语法来生成**kwargs双splat关键字参数映射:

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

但这不是更具可读性,是吧.

你可以在事后设置那些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
Run Code Online (Sandbox Code Playgroud)

但那仍然更难看.

请注意,字典显示(语法官方术语)对于解释器来说比调用更快dict(),因为使用更少的字节码指令来构建一个,并且不涉及函数调用.