Dom Grigonis wrote: > This feels superfluous. Instead of creating new dict class I would propose > either: > 1. Not to have None values > a) It is most likely possible to pre-delete all None values before you use > the dict = {k: v for k, v in dict if v is not None} > b) Not to create them in the first place (if it depends on you) > 2. Or simply: (dict.get(‘k1’) or dict()).get(‘child_key') > > On 10 Jul 2023, at 22:18, Jothir Adithyan adithyanjot...@gmail.com wrote: > > Hi everyone, > > I would like to briefly present my idea regarding the `get` function > > commonly used with dictionaries. When working with large amounts of JSON > > data, I often encounter code that doesn't feel very Pythonic to me. > > Problem Statement: > > The `get` function allows chaining of method calls, which is quite useful > > when working with dictionaries. It also has a convenient `default` > > parameter that returns a default value if the key is not found in the > > dictionary. This feature makes it safe and easy to use. However, problems > > arise when the dictionary contains the key we are accessing, but the > > corresponding value is `None`. In such cases, subsequent `get` calls fail > > because the `get` method belongs to objects of type `dict` and not `None`. > > To address this, I propose adding a new parameter to the `get` function or > > introducing a new function called `get_or` that swiftly handles this issue. > > This new parameter, called `arbitrary`, would accept an arbitrary value to > > be returned by subsequent `get` calls in case the retrieved value of the > > key is `None`. > > Assumptions: > > The problem statement is based on a few assumptions: > > > > You prefer chaining `get` statements for cleaner code. > > You expect at least some of the `get` methods to return `None`. > > You want to avoid the hassle of using `try` and `except` for every `get` > > chain. > > > > If you fall into the category of people who wish for a simpler way to work > > with dictionaries and handle large amounts of data, I hope you can > > empathise with this proposal. > > I have made a simple implementation by modifying the `get` method, which is > > below this thread. I would appreciate your valuable input on this feature. > > Before diving into coding, I want to make sure this is not a bad idea > > waiting to reveal itself in the dark. > > Thank you for taking the time to read this thread. Your feedback is greatly > > appreciated. > > Best regards, > > Jothir Adithyan > > **Runnable Version** > > https://replit.com/@Adithyan71/GetOr > > **Code Samples.** > > class PlayDict(dict): > > def get_or(self, key, arbitrary=None, default=None): > > if not self.__contains__( > > key > > ): # case 1 the key does not exist hence the default value > > return default > > elif ( > > self[key] is None > > ): # case 2 key does exist but the value is None return the arb > > value > > return arbitrary > > return self[key] # case 3 the key is present and the value is not > > None > > > > > > import contextlib > > parent_dict = PlayDict() > > parent_dict['k1'] = None > > parent_dict['k2'] = {"child_key": "val"} # Parent dict can contain nested > > dicts > > > > with contextlib.suppress(AttributeError): > > result = parent_dict.get("k1", {}).get("child_key") # This will raise > > AttributeError > > > > result = parent_dict.get_or("k1", default={}, > > arbitrary={}).get("child_key") # This will work > > > > print(result) > > > > > > Python-ideas mailing list -- python-ideas@python.org > > To unsubscribe send an email to python-ideas-le...@python.org > > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > > Message archived at > > https://mail.python.org/archives/list/python-ideas@python.org/message/IELDCU... > > Code of Conduct: http://python.org/psf/codeofconduct/ > >
I understand your perspective, but the fact is that this makes the code lengthier and adds an extra step to what I am already trying to do. Additionally, if I understand correctly, I could implement a built-in method as a function that takes in the key and uses a try-except block to get the value or return None, which is essentially Python's way of handling missing values (similar to get()). I proposed this solution because Python is widely used by many people and organizations for web scraping and API integrations, where None values are often expected and need to be handled efficiently. I believe this could be a valuable addition, but please correct me if I'm wrong. _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/LWOSXQSZKYO6KUKIZCA6ONUDKRKD4N7G/ Code of Conduct: http://python.org/psf/codeofconduct/