Question: try this:

```
d = {"One":1,"Two":2,"Three":3}
d.get("Two", Print("Fail"))

```

Expected Output:

> 
> 
> > 
> > 2
> > 
> > 
> > 
> 
> 
> 

Actual Output:

> 
> 
> > 
> > Fail
> > 
> > 
> > 2
> > 
> > 
> > 
> 
> 
> 

Anyone know why the right hand argument of this expression is eagerly evaluated? What's the point of processing the right hand argument if there's a chance it's not returned? 

Is there a logic to this I'm missing?

Answer: 
It's always evaluated because any functions has to be resolved *before* the return value can be sent to `get`.

Instead, you supply a default *value* to use if the key is not present, or if you need to check multiple keys to get a value, the `get` call will return `None`:

```
val = d.get("Two")

if val is None:
    print("Fail..")

```

This is similar to:

```
if 'Two' not in d:
    print("Fail..")

```

If you don't want to provide a default value, the first example can still be useful if you have multiple possible values to check - chaining `.get` calls or having multiple `if .. is None: ..` checks all the way down.
If you want lazy evaluation, you should use the `or` operator

```
d = {"One":1,"Two":2,"Three":3}
d.get("Two") or (print("Fail"))

```