default parameter in fuctions to clean up flow
I have had a long standing unanswered question on on stackoverflow: is it possible to pass a function to a default parameter so that you could do in essence things like this. def time_diff(target_time, curr_time= lambda : datetime.now() ): return curr_time - target_time this would be an syntactical improvement over this style where you have if statement to initialize a missing parameter. def time_diff(target_time, curr_time=None): if curr_time == None: curr_time = datetime.datetime.now() return curr_time - target_time
I should add to this (as I cant edit my post) that please note it is not a constant we are adding. Its a value that will change each time you call the function. It could be a GUID or rand number too. In this case its the current time.
On 27.07.20 16:01, Peter Moore wrote:
I have had a long standing unanswered question on on stackoverflow: is it possible to pass a function to a default parameter so that you could do in essence things like this.
def time_diff(target_time, curr_time= lambda : datetime.now() ): return curr_time - target_time
There was a discussion about this topic recently: https://mail.python.org/archives/list/python-ideas@python.org/thread/MILIX6H...
I have had a long standing unanswered question on on stackoverflow: is it possible to pass a function to a default parameter so that you could do in essence things like this.
def time_diff(target_time, curr_time= lambda : datetime.now() ): return curr_time - target_time
this would be an syntactical improvement over this style where you have if statement to initialize a missing parameter.
def time_diff(target_time, curr_time=None): if curr_time == None: curr_time = datetime.datetime.now() return curr_time - target_time I will point out that you CAN pass a function as the default value of a function parameter, and it means that the parameter will be bound to the function itself, so it becomes a callable (so doesn't help you in your case). But this does become an impediment to trying to define it this way, you need somehow to distinguish between the function itself being
On 7/27/20 10:01 AM, Peter Moore wrote: the default value, or some magically invocation of the function at each call. -- Richard Damon
Anyway, that is feasible via a decorator. Since it can't be done the wya you are proposing as is, since having a function as a default argument is valid Python (and the function is not called) - and having new syntax for this would be more cumbersome than using a decorator, I think that closes the gap. If such a decorator would be useful enough to cut it into the stlib, is another question though - I'd probably find it occasionally useful myself, but even so, I am +0 on this - it is not like ``` if parameter is sentinel: parameter = factory() ``` would be too much to type. On a second thought - proper documenting and giving visibility to a decorator like this could make it be used in patterns like ``` @factoryargs def myfunction(a, b, c=list): pass ``` and we could see a drop in the newcomers to Python putting a `[]` as default argument. Ok - I just convinced myself - I am +1 for such a decorator now. Now, please, the S.O. link. (that is me needing 2 more upvotes to round another 10K rep) On Mon, 27 Jul 2020 at 20:42, Richard Damon <Richard@damon-family.org> wrote:
I have had a long standing unanswered question on on stackoverflow: is it possible to pass a function to a default parameter so that you could do in essence things like this.
def time_diff(target_time, curr_time= lambda : datetime.now() ): return curr_time - target_time
this would be an syntactical improvement over this style where you have if statement to initialize a missing parameter.
def time_diff(target_time, curr_time=None): if curr_time == None: curr_time = datetime.datetime.now() return curr_time - target_time I will point out that you CAN pass a function as the default value of a function parameter, and it means that the parameter will be bound to the function itself, so it becomes a callable (so doesn't help you in your case). But this does become an impediment to trying to define it this way, you need somehow to distinguish between the function itself being
On 7/27/20 10:01 AM, Peter Moore wrote: the default value, or some magically invocation of the function at each call.
-- Richard Damon _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-leave@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/64ZTCJ... Code of Conduct: http://python.org/psf/codeofconduct/
On 2020-07-28 at 11:04:25 -0300, "Joao S. O. Bueno" <jsbueno@python.org.br> wrote:
Anyway, that is feasible via a decorator. Since it can't be done the wya you are proposing as is, since having a function as a default argument is valid Python (and the function is not called) - and having new syntax for this would be more cumbersome than using a decorator, I think that closes the gap.
If such a decorator would be useful enough to cut it into the stlib, is another question though - I'd probably find it occasionally useful myself, but even so, I am +0 on this - it is not like
``` if parameter is sentinel: parameter = factory() ``` would be too much to type.
On a second thought - proper documenting and giving visibility to a decorator like this could make it be used in patterns like ``` @factoryargs def myfunction(a, b, c=list): pass ``` and we could see a drop in the newcomers to Python putting a `[]` as default argument.
That's great, until I have something like this: @factoryargs def myfunction(a, b, c=list, d=3.4): pass Is c a factory? Is d a factory?
Ok - I just convinced myself - I am +1 for such a decorator now.
I don't mean to be a wet blanket, but what's wrong with a helper function? def time_diff_from_now(target_time): return time_diff(target_time, datetime.datetime.now()) def time_diff(target_time, curr_time): return curr_time - target_time No decorators, no new syntax, explicit at the calling sites.
On Mon, 27 Jul 2020 at 20:42, Richard Damon <Richard@damon-family.org> wrote:
I have had a long standing unanswered question on on stackoverflow: is it possible to pass a function to a default parameter so that you could do in essence things like this.
def time_diff(target_time, curr_time= lambda : datetime.now() ): return curr_time - target_time
this would be an syntactical improvement over this style where you have if statement to initialize a missing parameter.
def time_diff(target_time, curr_time=None): if curr_time == None: curr_time = datetime.datetime.now() return curr_time - target_time I will point out that you CAN pass a function as the default value of a function parameter, and it means that the parameter will be bound to the function itself, so it becomes a callable (so doesn't help you in your case). But this does become an impediment to trying to define it this way, you need somehow to distinguish between the function itself being
On 7/27/20 10:01 AM, Peter Moore wrote: the default value, or some magically invocation of the function at each call.
-- Richard Damon _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-leave@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/64ZTCJ... Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-leave@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/EGFSGU... Code of Conduct: http://python.org/psf/codeofconduct/
-- “Whoever undertakes to set himself up as a judge of Truth and Knowledge is shipwrecked by the laughter of the gods.” – Albert Einstein Dan Sommers, http://www.tombstonezero.net/dan
Ok my thoughts was that python is such an elegant language, a process that could add a non static value (a callable or generator for example) to a function's default parameter would add more elegance to the default handling. what a decorator and a helper function do is to double the amount of functions to make one function. So in order to understand such a function, the reader has to understand 2 functions. In that case the reader would be better off with the normal. if curr_time == None: curr_time = datetime.datetime.now() you might say that the reader has to understand what datetime.datetime.now() but there is no surprises with that function.
S.O post was this one. https://stackoverflow.com/questions/50653182/can-a-lambda-or-other-method-be...
What you're running into is how Python handles default arguments. Take this for example: def my_func(seq=[]): print(seq) seq.append(42) print(seq) my_func() # [] # [42] my_func() # [42] # [42, 42]
When I have needed this I have added a separate <name>_factory keyword argument to my function - so the user can specify a value to <name> or a callable to <name>_factory with the doc string clearly spelling out the semantics - and what happens if neither is passed - yes another argument but the semantics are entirely clear. The other option where having a default value of a function doesn’t ever make sense is to assume that if a callable is passed then it must be a factory. So you can do an iscallable check -- Anthony Flury email : Anthony.flury@btinternet.com Twitter : @TonyFlury
On 11 Aug 2020, at 14:41, William Pickard <lollol222gg@gmail.com> wrote:
What you're running into is how Python handles default arguments.
Take this for example: def my_func(seq=[]): print(seq) seq.append(42) print(seq)
my_func() # [] # [42]
my_func() # [42] # [42, 42] _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-leave@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/DJLTF3... Code of Conduct: http://python.org/psf/codeofconduct/
William Pickard writes:
What you're running into is how Python handles default arguments.
I believe that he understands that, and intended to ask the question that is discussed in this thread: https://mail.python.org/archives/list/python-ideas@python.org/thread/MILIX6H... To get to the meat of the argument, scroll down a page or two to Steven d'Aprano's contribution at 20 May 11:51 a.m. (I believe that times are converted to UTC so that's probably the exact time you're looking for). You still have to read much of the rest of the thread to see the various proposals (including ways to mark arguments for deferred evaluation).
Yes exactly. datetime.datetime.now() would call the function and datetime.datetime.now would pass the function. So it would be nice to have a way to pass a deferred call.
participants (8)
-
2QdxY4RzWzUUiLuE@potatochowder.com
-
Anthony Flury
-
Dominik Vilsmeier
-
Joao S. O. Bueno
-
Peter Moore
-
Richard Damon
-
Stephen J. Turnbull
-
William Pickard