簡體   English   中英

如何實現類似dict的`get`方法?

[英]How to implement dict-like `get` method?

我有自己的數據結構,我想實現mystructure.get(id)它在dict中的工作方式。

如果沒有傳遞default參數,它應該引發self.NotFound異常。 問題是我無法判斷default是否已被省略或None是否已通過。

如果沒有id==48的 object

mystructure.get(48)

應該提出NotFound

mystructure.get(48, default=None)

應該返回None

你知道如何區分這兩者嗎?

class MyStructure:
    ...

    def get(self, _id, default=None):
        ...

我想到的唯一一件事(而且很臟):

def get(self, _id, default="173095fb-da18-4bab-b943-2f51c327f7cb"):
    ..._id not found in this structure...
    if default=="173095fb-da18-4bab-b943-2f51c327f7cb":
        raise self.NotFound
    return default

您可以通過生成自己獨特的 object 並使用它而不是None作為默認參數值來做到這一點。

class MyStructure:

    NUL = object()
    class NotFound(Exception): pass

    def get(self, _id, default=NUL):
        if default is self.NUL:
            raise self.NotFound(f'{_id=}')
        print('OK')


inst = MyStructure()
inst.get(13, None)  # -> OK
inst.get(42, -1)    # -> OK
inst.get(48)        # -> __main__.NotFound: _id=48

評論

當具有默認值的參數被忽略時,引發“未找到”錯誤似乎並不奇怪。 如果不能省略,為什么還要提供默認值?

您還可以分配一個簡單的錯誤字符串,如果None沒有傳遞給它,則引發錯誤......像這樣

def get(self, key, default = "Not Found"):
        if default is not None:
            raise self.NotFound(f'{key}')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM