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>])
关键字参数必须是有效的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(),因为使用更少的字节码指令来构建一个,并且不涉及函数调用.