当我尝试创建此
时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>]
)
答案 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()
调用,因为使用较少的字节码指令来构建一个而没有函数打电话。