121

私はPythonに非常に慣れていないので.、aの値にアクセスするための表記ができればいいのにと思いますdict

私がtestこのようなものを持っているとしましょう:

>>> test = dict()
>>> test['name'] = 'value'
>>> print(test['name'])
value

しかし、私はtest.name得ることができればいいのにと思いますvalue__getattr__実際、クラスのメソッドを次のようにオーバーライドすることでそれを行いました。

class JuspayObject:

    def __init__(self,response):
        self.__dict__['_response'] = response

    def __getattr__(self,key): 
        try:
            return self._response[key]
        except KeyError,err:
            sys.stderr.write('Sorry no key matches')

そしてこれはうまくいきます!私がする時:

test.name // I get value.

しかし、問題は、私がtest単独で印刷すると、次のようなエラーが発生することです。

'Sorry no key matches'

なぜこうなった?

4

11 に答える 11

9

名前付きタプルを使用できますか?

from collections import namedtuple
Test = namedtuple('Test', 'name foo bar')
my_test = Test('value', 'foo_val', 'bar_val')
print(my_test)
print(my_test.name)

于 2013-04-29T13:09:42.340 に答える
6

__getattr__他のすべての属性ルックアップ ルールが失敗した場合のフォールバックとして使用されます。オブジェクトを「印刷」しようとすると、Python はメソッドを探し__repr__ます。クラスに実装していないため、呼び出されてしまいます__getattr__(はい、Python ではメソッドも属性です)。どのキーgetattrが呼び出されるかを想定してはいけません。最も重要なのは、__getattr__解決できない場合は AttributeError を発生させる必要があることkeyです。

補足として、通常の属性アクセスには使用しないでください。self.__dict__単純な属性表記を使用してください。

class JuspayObject:

    def __init__(self,response):
        # don't use self.__dict__ here
        self._response = response

    def __getattr__(self,key):
        try:
            return self._response[key]
        except KeyError,err:
            raise AttributeError(key)

クラスに他の責任がない場合 (および Python バージョンが >= 2.6 であり、古いバージョンをサポートする必要がない場合)、namedtuple を使用できます: http://docs.python.org/2/library/ collections.html#collections.namedtuple

于 2013-04-29T14:22:48.677 に答える
3

以下は、ネストされた項目を操作する単純で便利なドット表記ヘルパーの例です。

def dict_get(data:dict, path:str, default = None):
    pathList = re.split(r'\.', path, flags=re.IGNORECASE)
    result = data
    for key in pathList:
        try:
            key = int(key) if key.isnumeric() else key 
            result = result[key]
        except:
            result = default
            break
    
    return result

使用例:

my_dict = {"test1": "str1", "nested_dict": {"test2": "str2"}, "nested_list": ["str3", {"test4": "str4"}]}
print(dict_get(my_dict, "test1"))
# str1
print(dict_get(my_dict, "nested_dict.test2"))
# str2
print(dict_get(my_dict, "nested_list.1.test4"))
# str4
于 2021-07-06T21:12:05.283 に答える
0

クラスにメソッドを追加して__repr__()、表示するテキストをカスタマイズできるようにします

print text

詳細はこちら: https://web.archive.org/web/20121022015531/http://diveintopython.net/object_directional_framework/special_class_methods2.html

于 2013-04-29T13:00:46.920 に答える