更改多个if语句

时间:2017-04-25 11:34:32

标签: python arrays dictionary for-loop if-statement

我几天前开始学习python,还有许多我不知道的事情,但我正在努力 所以,我有这个:

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()

感谢您的关注。

2 个答案:

答案 0 :(得分:0)

使用getattr 从用户对象获取属性。而且您不再需要if

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

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

请注意,字典值应该是字符串,因为这些方法与User对象绑定,您无法像无界函数一样调用它们。

显然,你可以不用字典:

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

答案 1 :(得分:0)

您有三种选择:

  • 存储方法名称,然后使用getattr()将名称重新转换为对方法的引用:

    settings = {
        'MAKE': 'make',
        'MOD': 'mod',
        'REM': 'rem'
    }
    if setting in settings:
        rettt = getattr(User, settings[setting])()
    

    我注意到,在这一点上,这变成了一个简单的小套管练习,也许是通过一套测试来确保你不能调用任意方法:

    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]()
    
  • 使用operator.methodcaller() objects;这些采用字符串方法名称,可以使用对象调用 on

    from operator import methodcaller
    
    settings = {
        'MAKE': methodcaller('make'),
        'MOD': methodcaller('mod'),
        'REM': methodcaller('rem')
    }
    if setting in settings:
        rettt = settings[setting](User)