So, here's a challenge: Come up with something really simple,
and write an insanely complicated - yet perfectly valid - way
to achieve the same thing. Bonus points for horribly abusing
Python's clean syntax in the process.
Go on, do your worst!
I've often thought it was redundant for Python to support 'if'
when it has dictionaries, cf the rationale for having no
'switch'.
valid_name = None
while not valid_name:
name = input("Enter your name: ")
valid_name = {
True: lambda: print("No name longer than 20 letters."),
False: lambda: True,
}[len(name) > 20]()
Much better.
Good! Good! But, waaaah. Waaaah.
def get_name():
while True:
name = input("Enter your name: ")
yield {
True: lambda: print("No name longer than 20 letters."),
False: lambda: name,
}[len(name) > 20]()
name = next(filter(None,get_name()))
Oh, cruel. But you can do worse. Who needs "while" when you have
filter(iter(FUNCTION, object()))?
def get_name():
name = input("Enter your name: ")
return [
lambda: name,
lambda: print("No name longer than 20 letters."),
][len(name) > 20]()
name = next(filter(None, iter(get_name, object())))
But who needs *any* of this! Defining functions is so old-hat. It's
all already in the standard library (using only assignments and function-calls):
from functools import partial
from operator import getitem, ge, methodcaller
from itertools import compress, tee
apply = methodcaller("__call__")
ret_true = partial(getitem, [True], 0)
print_invalid = partial(print, "No name longer than 20 letters.")
inputs = iter(partial(input, "Enter your name: "), ...)
inputs, valid = tee(inputs)
valid = map(len, valid)
valid = map(partial(ge, 20), valid)
side_effect_valid = map(partial(getitem, [print_invalid, ret_true]), valid)
side_effect_valid = map(apply, side_effect_valid)
valid_inputs = compress(inputs, side_effect_valid)
name = next(valid_inputs)
Which can be "neatly" expressed as two statements (I'm struggling to
got it to one without those evil lambdas):
from functools import partial
from operator import getitem, ge, methodcaller
from itertools import compress, tee
inputs, valid = tee(iter(partial(input, "Enter your name: "), ...))
name = next(
compress(
inputs,
map(
methodcaller("__call__"),
map(
partial(
getitem,
[
partial(print, "No name longer than 20 letters."),
partial(getitem, [True], 0)
]
),
map(
partial(ge, 20),
map(len, valid)
)
)
)
)
)
Beautiful, see?
Of course, the most powerful function deals with this much more quickly:
exec("""
while True:
name = input("Enter your name: ")
if len(name) <= 20:
break
else:
print("No name longer than 20 letters.")
""")