如何重构Python“switch 语句”
我正在重构一位朋友编写的一些代码,最近偶然发现了这个函数:
def setup_parameters(self, data):
'''Parse raw data to determine game settings.'''
for line in data.split('\n'):
line = line.strip().lower()
if line:
tokens = line.split()
self.L.debug("tokens: " + str(tokens))
key = tokens[0]
if key == 'cols':
self.width = int(tokens[1])
elif key == 'rows':
self.height = int(tokens[1])
elif key == 'player_seed':
random.seed(int(tokens[1]))
elif key == 'turntime':
self.turntime = int(tokens[1])
elif key == 'loadtime':
self.loadtime = int(tokens[1])
elif key == 'viewradius2':
self.viewradius2 = int(tokens[1])
elif key == 'attackradius2':
self.attackradius2 = int(tokens[1])
elif key == 'spawnradius2':
self.spawnradius2 = int(tokens[1])
如您所见,这里有一种令人讨厌的 switch 语句,它显然需要字典。我很想将其写为类字典,因为键是不变的,但由于键映射到实例的属性(即“cols”:self.width),因此无法编译。
那么我的问题是,重构此类代码的正确方法是什么?
I'm refactoring some code that a friend wrote and recently stumbled across this function:
def setup_parameters(self, data):
'''Parse raw data to determine game settings.'''
for line in data.split('\n'):
line = line.strip().lower()
if line:
tokens = line.split()
self.L.debug("tokens: " + str(tokens))
key = tokens[0]
if key == 'cols':
self.width = int(tokens[1])
elif key == 'rows':
self.height = int(tokens[1])
elif key == 'player_seed':
random.seed(int(tokens[1]))
elif key == 'turntime':
self.turntime = int(tokens[1])
elif key == 'loadtime':
self.loadtime = int(tokens[1])
elif key == 'viewradius2':
self.viewradius2 = int(tokens[1])
elif key == 'attackradius2':
self.attackradius2 = int(tokens[1])
elif key == 'spawnradius2':
self.spawnradius2 = int(tokens[1])
As you can see, there is a nasty kind of switch statement here, that clearly calls for a dictionary. I'm tempted to write this as a class dictionary since the keys are constant, but since the keys map to attributes of an instance (ie, 'cols': self.width) this doesn't compile.
My question is then, what is the right way to refactor such code?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
将键映射到属性的名称,并使用
setattr(self, attribute_name, int(tokens[1])
设置值。例如:Map the keys to the names of the attributes, and use
setattr(self, attribute_name, int(tokens[1])
to set the value. E.g.:您可以构建一个字典,其中键作为访问器,并使用 lambda 函数来执行每个键的代码。
You can build up a dictionary with the keys as accessors and lambda functions to execute the code for each key.
使用以下操作设置一个字典
:
setup a dict with actions like
and then: