Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 不区分大小写的getattr_Python 3.x - Fatal编程技术网

Python 3.x 不区分大小写的getattr

Python 3.x 不区分大小写的getattr,python-3.x,Python 3.x,给定一个模块,我希望能够在该模块中搜索不区分大小写的类 例如,如果我有以下模块utils/helpers.py class UtilityClass: def __init__(self): ... 在另一个脚本中,我希望能够以不区分大小写的方式按名称检索类 import utils.helpers as util_helpers module = getattr(util_helpers, 'utilityclass') 实现这一点最正确和最具Python风格的方

给定一个模块,我希望能够在该模块中搜索不区分大小写的类

例如,如果我有以下模块
utils/helpers.py

class UtilityClass:
    def __init__(self):
        ...
在另一个脚本中,我希望能够以不区分大小写的方式按名称检索类

import utils.helpers as util_helpers

module = getattr(util_helpers, 'utilityclass')

实现这一点最正确和最具Python风格的方法是什么?

您可以使用不区分大小写的版本覆盖
内置的.getattr

import builtins
import pprint
def igetattr(obj, attr):
    for a in dir(obj):
        if a.lower() == attr.lower():
            return orig_getattr(obj, a)
orig_getattr = builtins.getattr
builtins.getattr = igetattr
print(getattr(pprint, 'prettyprinter'))

这将输出:

如果存在
实用类
实用类
?这应该返回一个
列表
,引发一个异常或什么?简单的非有效的kludge类似于:
whatever={k.lower():v代表k,v代表变量(util\u helpers)。items()}['utilityclass']
-但是你有什么理由想这样做吗?你有没有考虑过如果有多个名字匹配会发生什么?@AzatIbrakov你可以假设我的情况永远不会发生这种情况。这不起作用。在我的例子中,我不是在类中寻找变量,而是在模块中寻找类。当我运行
dir(util\u helpers)
类名不会返回时,它实际上应该可以工作。我用一个例子更新了我的答案:在一个模块中获取一个名称不区分大小写的类。如果您仍然无法让问题为您工作,请使用实际代码更新您的问题。I get-TypeError:igetattr接受2个位置参数,但在我尝试使用此参数时给出了3个位置参数。特别是当我尝试
builtins.getattr=igetattr
@Shawn时,您能否将您的代码发布到repl.it,以便我们了解错误是如何产生的?