It's very important that f(z=5) Raises an exception if z is not an argument.

For your case, I'd do a wrapper, instead lf calling f(z=5) you can call
UniversalCall(f, x=1, y=2, z=5) if you want to specify it on the caller
side.

Or else, you can create a decorator :

@universal_callable
def f(x, y):
    ...

f(x=1, y=2, z=5)  # works !

On Mon, 24 Dec 2018, 11:21 李默 <phyl...@163.com wrote:

> I am having an idea on loosing the argument validity check when passing
> the function arguments in keyword way.
> For example:
> -------------------------------
> def f(x, y):
>
>     print(x, y)def call_f():
>     f(x=7, y=9, z=9)
>
> call_f()
>
> ------------------------------
>
> In the current of python, the extra pass of 'z' would let the interpreter 
> raise an exception and stop work.  My idea is that the interpreter need not 
> stop because all the needed args are completely provided.  Of course for this 
> toy example, 'f' can be define as  f(x, y, **kwargs) to achieve the same 
> goal.  However,  essentially it is reasonably to keep interpreter going as 
> long as enough args are passed.  And this modification can bring more freedom 
> of programming.
>
>
> Think about the following situations:
>
> situation 1) there are many 'f's written by other people, and their args are 
> very similar and your job is to run each of them to get some results.
>
> ---------------------
>
> ##########code by others:
>
> def f0():
>       ...
> def f1(x):
>       ...
> def f2(x, y):
>       ...
> def f3(x, y, z):
>       ...
>
> #if passing extra args are valid, you can run all the functions in the 
> following way, which is very compact and easy to read.
>
> def test_universal_call():
>
>       funcs = [f0, f1, f2, f3]
>       args = {'x':1, 'y':5, 'z':8}
>       for f in funcs:
>               f(**args)
>
> ------------------
>
>
> situation 2) there are several steps for make one product, each step is in an 
> individual function and needs different args.
>
> ------------------
>
> def make_oil(oil):
>       ...
>
> def make_water( water):
>       ...
>
> def make_powder(powder):
>       ...
>
> ## if passing extra args are valid, you can run all the functions in the 
> following way, which is very compact and easy to read.
>
> def dish():
>       procedures = [make_oil, make_water, make_powder]
>
>       args = {'oil' : 1, 'water': 10, 'powder': 4}
>       for f in procedures:
>               f(**args)
>
>
> ---------------
>
>
> This idea is different from **kwargs. **kwargs are used when user wants to 
> record all the keywords passed. This idea is that even if the user doesn’t 
> want to record the arguments, that extra pass of keyword arguments wont’t 
> cause an exception.
>
>
>
> Sorry for bothering you guys if this is a stupid idea.
>
> Happy to hear your suggestions.
>
>
> Li Mo
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to