[Python-ideas] Syntax to conditionally define a field in a dict

Christopher Barker pythonchb at gmail.com
Fri Apr 26 15:25:02 EDT 2019


Others have responded, but a note:

> What I want to do is:

```
def my_func(val_1, val_2):
    return {
        "field_1": val_1 if val_1,
        "next_depth": {
            "field_2": val_2 if val_2
        }
    }
```

I am finding this very confusing as to how to generalize this:

How do we know that val_1 belongs to the "top-level" field_1, and val_2 is
in the nested dict with field_2?

Or:
```
def my_func(val_1, val_2):
    return {
        if val_1 : "field_1": val_1,
        "next_depth": {
            if val_2: "field_2": val_2
        }
    }

but this makes it seem like that distinction is hard-coded -- so is the
nested dict is relevant?

> The more core syntax, which should be valid throughout the language,
would be to have statements like `x = y if cond`

we have the

x = y if cond else

expression already -- and an assignment HAS to be assigned to something, so
it seems what you want is:

x = y if cond else None

Maybe the "else None" feels like too much typing, but I prefer the
explicitness myself. (and look in the history of this thread for "null
coalescing" discussion, that _may_ be relevant.

The first of these intuitively reorganizes to `if cond: x = y`

then what do we get for x  `if not cond`? it ends up undefined? or set to
whatever value it used to have?

Frankly, I think that's a mistake -- you're going to end up with having to
trap a NameError or do a a hasattr() check later on anyway. It's generally
considered good practice to set a name to None if it isn't defined, rather
than not defining it.

> and `x[y if cond]` ... But the second is not as clear, with a likely
equivalent of `if cond: x[y] else raise Exception`.

assuming x is a dict, then you could do:

d[y if cond else []] = value

It's a hack, but as lists aren't hashable, you get an TypeError, so maybe
that would work for you?

example:

In [16]: key = "Fred"
In [17]: value = "Barnes"
In [18]: d = {}

In [19]: # If the key is Truthy:
In [20]: d[key if key else []] = value

In [21]: d
Out[21]: {'Fred': 'Barnes'}

In [22]: # if the key is Falsey:
In [23]: key = None

In [24]: d[key if key else []] = value
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-170a67b9505a> in <module>()
----> 1 d[key if key else []] = value

TypeError: unhashable type: 'list'

-CHB




--
Christopher Barker, PhD

Python Language Consulting
  - Teaching
  - Scientific Software Development
  - Desktop GUI and Web Development
  - wxPython, numpy, scipy, Cython
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20190426/944ee5c0/attachment.html>


More information about the Python-ideas mailing list