如何通过(字符串)名称选择变量?
- 2024-11-28 08:38:00
- admin 原创
- 12
问题描述:
我想根据字符串输入,从我的函数返回一个预先确定的列表。
def get_ext(file_type):
text = ['txt', 'doc']
audio = ['mp3', 'wav']
video = ['mp4', 'mkv']
return # what do I return here?
get_ext('audio') #should return the list ['mp3', 'wav']
最简单的方法是什么?
有关尝试使用字符串分配或创建变量的相关问题,请参阅如何创建变量?。这个问题是关于查找它们的。
要查找现有对象(而不是当前局部变量),请参阅如何通过给定与该属性名称对应的字符串来访问对象属性。
解决方案 1:
在大多数情况下,一本普通的字典就足以完成这种工作。
>>> 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']
解决方案 2:
如果您不想像@timgeb 的答案中那样定义字典,那么您可以调用locals()
,它会为您提供dict
本地范围内可用的变量。
def get_ext(file_type):
text = ['txt', 'doc']
audio = ['mp3', 'wav']
video = ['mp4', 'mkv']
return locals()[file_type]
并进行测试以证明其有效:
>>> get_ext("text")
['txt', 'doc']
解决方案 3:
您可以轻松地将 dict 与 tuple/list 值一起使用,如下所示:
def get_ext(file_type):
d = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']}
return d[file_type]
print(get_ext('audio'))
解决方案 4:
使用字典:
def get_ext(file_type):
d = {'text' : ['txt', 'doc'],
'audio' : ['mp3', 'wav'],
'video' : ['mp4', 'mkv']}
try:
return d[file_type]
except KeyError:
return []
get_ext('audio') # ['mp3', 'wav']
如果该键不存在,则返回空列表。然而,这是我想到的最简单的答案,有关更好的答案,请参阅@timgeb 的答案。
解决方案 5:
根据@timgeb 的回答,我会使用字典,但如果您访问量很大、关心速度并且不想定义类,那么您可以使用缓存。
from functools import lru_cache
def get_ext(file_type):
d = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']}
return d[file_type]
@lru_cache(maxsize=3, typed=False)
def get_ext_cached(file_type):
d = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']}
return d[file_type]
from timeit import timeit
# non cached
print(timeit(stmt='get_ext("text")', globals={'get_ext': get_ext}))
# 0.48447531609922706 on my machine
# cached
print(timeit(stmt='get_ext("text")', globals={'get_ext': get_ext_cached}))
# 0.11434909792297276
虽然对于这种特殊情况来说,它可能有点过度,你可以直接在字典上调用 get(缓存只是构建它自己的字典并执行相同的操作),你可以在将来将它用于任何实际上是计算查找的纯函数。
d = {'text': ['txt', 'doc'],
'audio': ['mp3', 'wav'],
'video': ['mp4', 'mkv']}
# 0.05016115184298542
print(timeit(stmt="d['text']",
globals={'d':d,'c':c}))
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件