2017-04-25 152 views
0

我开始学习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() 

感谢您的关注。

回答

0

你有三个选择:

  • 存储方法,然后用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) 
    
0

使用getattr从用户对象获取属性。你不会需要if不再:

settings = { 
'MAKE': 'make', 
'MOD': 'mod', 
'REM': 'rem' 
} 

rettt = getattr(User, settings[setting])() 

注意,字典中的值应该是字符串,因为方法一定到User对象,你不能打电话给他们,你会无限的功能。

显然,你可以做无字典:

rettt = getattr(User, setting.lower())() 
+0

不坏,我会检查。无论如何,这是非常有趣的解决 – Piduna

+0

getattr()抛出AttributeError除非你提供一个默认返回值(或检查提供的设置是一个有效的方法) – rolika

+0

@rolika:但如果设置字典被认为是一个正确的来源方法名称,你最多会有一个'KeyError'。 –