更改多个if语句
问题描述:
我开始学习python,几天前,还有很多我不知道的东西,但我在尝试。
所以,我有这样的:更改多个if语句
if setting == MAKE:
rettt = User.make()
elif setting == MOD:
rettt = User.mod()
elif setting == REM:
rettt = User.rem()
你怎么想的,我们可以改变这个上类似,即:
settings = {
'MAKE': make,
'MOD': mod,
'REM': rem
}
if setting in settings:
rettt = User.settings()
感谢您的关注。
答
你有三个选择:
-
存储方法名,然后用
getattr()
打开名称回一个参考方法:settings = { 'MAKE': 'make', 'MOD': 'mod', 'REM': 'rem' } if setting in settings: rettt = getattr(User, settings[setting])()
I注意,在这一点上这将成为一个简单的下部壳体锻炼,或许是一套测试,以确保您不能调用任意方法:
settings = {'MAKE' 'MOD', 'REM'} if setting in settings: rettt = getattr(User, setting.lower())()
-
每次存放在字典中的绑定方法:
settings = { 'MAKE': User.make, 'MOD': User.mod, 'REM': User.rem, } if setting in settings: rettt = settings[setting]()
-
使用;这些都需要一个字符串方法名称,可以用一个对象调用来调用方法上:
from operator import methodcaller settings = { 'MAKE': methodcaller('make'), 'MOD': methodcaller('mod'), 'REM': methodcaller('rem') } if setting in settings: rettt = settings[setting](User)
答
使用getattr
到从用户对象获取属性。你不会需要if
不再:
settings = {
'MAKE': 'make',
'MOD': 'mod',
'REM': 'rem'
}
rettt = getattr(User, settings[setting])()
注意,字典中的值应该是字符串,因为方法一定到User
对象,你不能打电话给他们,你会无限的功能。
显然,你可以做无字典:
rettt = getattr(User, setting.lower())()
不坏,我会检查。无论如何,这是非常有趣的解决 – Piduna
getattr()抛出AttributeError除非你提供一个默认返回值(或检查提供的设置是一个有效的方法) – rolika
@rolika:但如果设置字典被认为是一个正确的来源方法名称,你最多会有一个'KeyError'。 –