从Python中的函数按名称返回变量

卢多洛科:

我正在尝试使用函数返回给定列表。

def get_ext(file_type):
    text = ['txt', 'doc']
    audio = ['mp3', 'wav']
    video = ['mp4', 'mkv']
    return ?????

get_ext('audio')  #should return de list ['mp3', 'wav']

然后我被卡住了。这是大量扩展的简单/简短示例。最简单的方法是什么?

timgeb:

在大多数情况下,普通字典就可以完成这项工作。

>>> get_ext = {'text': ['txt', 'doc'],
...            'audio': ['mp3', 'wav'],
...            'video': ['mp4', 'mkv']
... }
>>> 
>>> get_ext['video']
['mp4', 'mkv']

如果您确实想要或需要一个功能(可能有正当的理由),则有两种选择。最简单的get方法之一就是分配给字典方法。get_ext如果您不需要幕后字典,甚至可以重新分配名称

>>> get_ext = get_ext.get
>>> get_ext('video')
['mp4', 'mkv']

None如果您输入未知密钥,此函数将默认返回

>>> x = get_ext('binary')
>>> x is None
True

如果您想用一个KeyError代替未知密钥,请分配给get_ext.__getitem__代替get_ext.get

如果要自定义默认值,一种方法是将字典包装在函数中。本示例使用一个空列表作为默认值。

def get_ext(file_type):
    types = {'text': ['txt', 'doc'],
             'audio': ['mp3', 'wav'],
             'video': ['mp4', 'mkv']
    }

    return types.get(file_type, [])

但是,@ omri_saadon给出了有效的说明,types = ...即每个函数调用都执行赋值。如果这困扰您,您可以采取以下措施来解决此问题。

class get_ext(object):
    def __init__(self):
        self.types = {'text': ['txt', 'doc'],
                      'audio': ['mp3', 'wav'],
                      'video': ['mp4', 'mkv']
        }

    def __call__(self, file_type):
        return self.types.get(file_type, [])

get_ext = get_ext()

从此以后,您可以get_ext像常规函数一样使用,因为最后可调用对象就是可调用对象。:)

请注意,这种方法(除了self.types只能创建一次)具有很大的优势,即您仍可以轻松更改函数可以识别的文件类型。

>>> get_ext.types['binary'] = ['bin', 'exe']
>>> get_ext('binary')
['bin', 'exe']

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章