如何通过(字符串)名称选择变量?

2024-11-28 08:38:00
admin
原创
165
摘要:问题描述:我想根据字符串输入,从我的函数返回一个预先确定的列表。def get_ext(file_type): text = ['txt', 'doc'] audio = ['mp3', 'wav'] video = ['mp4', 'mkv'] return # what d...

问题描述:

我想根据字符串输入,从我的函数返回一个预先确定的列表。

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}))
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2500  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1541  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   16  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   23  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   26  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用