On 24Mar2019 14:33, boB Stepp <robertvst...@gmail.com> wrote:
On 23Mar2019 22:15, boB Stepp <robertvst...@gmail.com> wrote:

The lambda is just a single line function definition, and doesn't get a
function name.

So your get_input name now accepts a "date_constructor" parameter and
you would change the input step from this:

    try:
        identifier = int(input(input_prompt))
        if date_value_err_ck:
            date(*date_value_err_ck)
    except ValueError:

to this:

    try:
        value = int(input(input_prompt))
        date = date_constructor(value)
    except ValueError:

You could not know this from the code I showed (As I pared it down to
illustrate my problem.), but I am also using get_input() to pull in
from the user non-date values, too, but they are also all integers:
pages_read and total_pages_to_read.  Because of this, for these latter
two items, "date_value_err_ck" will be assigned "None", which is why I
have the "if date_value_err_ck:".

Ok. So I realised later that you're not using the date from date_constructor; you're just calling it to see if it raises ValueError as a sanity check.

Why not make that a condition, and drop date_value_err_ck altogether?

   'conditions': [
       (lambda goal_year: datetime.date(goal_year, 1, 1),
           "This doesn't look like a valid date year to datetime.date()."),


and make the condition checking code more robust:

   for bad_condition, message in conditions:
       try:
           badness = bad_condition(input_value)
       except ValueError as e:
           print("Invalid goal_year, cannot even run the condition check! " + 
str(e))
       else:
           if badness:
               print(message)

That reduces your opening try/except to just checking that the input is a valid int, a lot simpler.

Well, when you define the goal_month constructor lambda function,
goal_year _is_ a local variable. And _because_ it is not a parameter of
the lambda, the lambda finds it in the scope where it was defined: the
scope at the bottom of your programme.

This is called a "closure": functions has access to the scope they are
define in for identifiers not locally defined (eg in the parameters or
the function local variables - which are those assigned to in the code).

This is so cool and useful!  I recall seeing this mentioned for nested
functions, but did not know it worked for lambdas as well.

Lambda are functions. Same rules.

Cheers,
Cameron Simpson <c...@cskk.id.au>
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to