I really don't see this goal as general purpose  enough to merit Python
syntax or standard library inclusion.  Needing a PyPI package to do
something slightly uncommon really doesn't feel like a bad obstacle.

Click is perfectly great.  It's a nice package for creating a certain kind
of command line interface, especially handy with subcommands.  Argparse
also supports subcommands.

But the cases where there is a single mapping from every function in a
module to an available command line argument/subcommand, always using the
same name, feel limited to me.  If that is what you want, that's fine, it's
not hard to do.  It can be as simple as an `eval()` in the __main__ block.
That particular use pattern feels niche to me.

Figuring out arguments to pass into functions, along with their types, is
certainly something that a command-line language COULD handle.  But it
doesn't seem like something that every command-line program should want to
handle in the same way.

On Fri, Oct 23, 2020 at 2:07 AM Michael Smith <mich...@smith-li.com> wrote:

> What a few responders have said is along the lines that my proposal
>
> 1. Can already be done.
> 2. Has gaps/is too simple.
>
> I will try to address those points here, but before I start, I'm getting
> the impression I don't have a great grasp of the communication style of
> this list. I assumed that a simple proposal with _some value_ would meet
> less resistance than a complex one with more value, so I left out features
> (like handling arguments). I will try to avoid MVP-ing my proposals in the
> future, as I think that led to a more "meh" initial response than my idea
> deserves.
>
> ---------
>
> Can calling a function from the command line already be done? Yes, I led
> with that. But my idea would lead to the following improvements:
>
> 1. Being able to call two different functions from the same module. (AND)
> 2. Being able to call some functions that exist today without modification
> or rearrangement. (AND)
> 3. Being able to invoke these things from python without installing a
> module from pip.
>
> There are solutions that do some of these, but nothing that does them all.
> I think it's surprising that the python makers have found worthwhile three
> different solutions for invoking modules, but this list so far has seen
> little value in invoking a function.
>
> -----
>
> Is my proposal oversimplified? Maybe? I actually think it's pretty nice
> just to be able to call a couple of arbitrary functions by name that know
> how to access args via argparse or whatever.
>
> It would definitely be more empowering to be able to describe the command
> line args to such an invocation using the args to the function.
>
> But, I guess the real weakness of my proposal was that it required
> anything special about the function at all. It'd be easy to handle some
> functions with arguments, certainly if they're all strings. Other primitive
> scalar types may be doable if we map type hints to constructors. But I
> can't think of a reasonable way to handle a function that expects a complex
> object for an argument.
>
> So, how about if the proposal expands to include functions with any arity
> of string-only arguments? I think that makes it possible to use a wide
> variety of functions without any special work.
>
> We could also say that positional arguments are treated positionally, and
> kwargs need to be expressed on the command line as --kwarg=value
>
> What else is missing?
>
> On Wed, Oct 21, 2020 at 13:15 Christopher Barker <python...@gmail.com>
> wrote:
>
>> FWIW, one of my intro students just yesterday asked about this:
>>
>> Is there a way to call a function in a python file directly from the
>> command line?
>>
>> I have no idea what their programming background is, or why they expected
>> that to be possible, but there you go -- at least one newbie expected it to
>> be possible :-)
>>
>> However: This was literally class number one -- I had not yet showed them
>> the "if __name__ == '__main__':" idiom yet.
>>
>> Also, I'm pretty sure this student's expectation was that there would not
>> have to be anything special about the function (except maybe taking only
>> string arguments?)  -- so it's probably not a good idea to try to solve
>> that use case anyway.
>>
>> But that was the first time I was ever asked that question -- and here it
>> is on python-ideas -- quite a coincidence!
>>
>> -CHB
>>
>>
>>
>>
>>
>> On Tue, Oct 20, 2020 at 11:16 PM Paul Sokolovsky <pmis...@gmail.com>
>> wrote:
>>
>>> Hello,
>>>
>>> On Wed, 21 Oct 2020 00:24:47 -0400
>>> Michael Smith <mich...@smith-li.com> wrote:
>>>
>>> > On Tue, Oct 20, 2020 at 23:43 Guido van Rossum <gu...@python.org>
>>> > wrote:
>>> >
>>> > > The ‘if __name__…’ idiom makes one function special. Hm... So if the
>>> > > module has that, will that main() still be called with your
>>> > > proposal? I.e., is __name__ still ‘__main__’?
>>> > >
>>> >
>>> > Perhaps not. If __name__ were still '__main__' and calling the
>>> > function implied importing the module, then anything in `if __name__
>>> > == '__main__'` would still get run. I think that would be
>>> > inconvenient for folks.
>>>
>>> Alternative valuation is that your proposal is inconvenient to folks,
>>> as it leaves too many gaps. Which, as it seems, you're eager to
>>> bravely patch, but that does/will lead to only more confusion.
>>>
>>> > I think __name__ should be the module name in the context of the
>>> > module, and the function name in the context of the function, in this
>>> > case.
>>>
>>> __name__ is the name of the module. Or, as a special exception, it's
>>> "__main__" for a module directly invoked as a script or via "-m"
>>> switch.
>>>
>>> There's no need to complicate it any further (it's already complicated
>>> enough; my bet that half of Python users won't be able to formulate it
>>> like above by heart).
>>>
>>>
>>> Back to the original proposal, there's no general need to invoke
>>> an arbitrary function in an arbitrary module. That just makes no sense,
>>> as most functions depend on context.
>>>
>>> If *you* need that, then, besides other options you mentioned in
>>> your original mail, it's trivial to write a module which will do it for
>>> you, like:
>>>
>>> python -m my_super_invocator module:thunk
>>>
>>>
>>> Actually, if you look on PyPI, I bet you'll find a few like that.
>>>
>>> >
>>> > On Tue, Oct 20, 2020 at 20:32 Michael Smith <mich...@smith-li.com>
>>> > wrote:
>>> > >
>>> > >>
>>> > >>
>>> > >> On Tue, Oct 20, 2020 at 23:12 Guido van Rossum <gu...@python.org>
>>> > >> wrote:
>>> > >>> On Tue, Oct 20, 2020 at 8:06 PM Michael Smith
>>> > >>> <mich...@smith-li.com> wrote:
>>> > >>>
>>> > >>>> On Tue, Oct 20, 2020 at 10:19 PM Guido van Rossum
>>> > >>>> <gu...@python.org> wrote:
>>> > >>>> >
>>> > >>>> > I think it would be a tad more convincing if there was a way
>>> > >>>> > to pass
>>> > >>>> arguments too (even if just a list of strings). At the very
>>> > >>>> least extra arguments should end up in sys.argv[1:].
>>> > >>>>
>>> > >>>> Could python -m 'module:thunk' have exactly the same behavior
>>> > >>>> with respect to arguments as `python3.8 -m module` does today?
>>> > >>>>
>>> > >>>> ```
>>> > >>>> $ cat bar.py
>>> > >>>> import pprint, sys
>>> > >>>>
>>> > >>>> def thunk():
>>> > >>>>     pprint.pprint(sys.argv)
>>> > >>>>
>>> > >>>> if __name__ == "__main__":
>>> > >>>>     thunk()
>>> > >>>>
>>> > >>>> $ python3.8 -m bar -- -1 --two --three=3
>>> > >>>> ['/Users/michael/bar.py', '--', '-1', '--two', '--three=3']
>>> > >>>> ```
>>> > >>>>
>>> > >>>> So then with the same bar.py, `python -m bar:thunk -- -2 --three
>>> > >>>> --four=4` would print `['/Users/michael/bar.py', '--', '-1',
>>> > >>>> '--two', '--three=3']`. I like this better than my previous
>>> > >>>> suggestion to shorthand python -c.
>>> > >>>>
>>> > >>>
>>> > >>> Actually it should print the same except for sys.argv[0]. (We
>>> > >>> could argue about what sys.argv[0] should be.)
>>> > >>>
>>> > >>>
>>> > >>>> > Then again, presumably the function must be specially crafted
>>> > >>>> > for
>>> > >>>> this usage. Why can't you just specially craft a module's main()?
>>> > >>>>
>>> > >>>> I'm not sure I know what you mean by "specially crafted", other
>>> > >>>> than the function only needs not require any formal parameters.
>>> > >>>> It doesn't need to be special-er than that. It can handle args
>>> > >>>> via sys.argv, as you suggested. Most of the `main` functions I
>>> > >>>> write today are just like that.
>>> > >>>>
>>> > >>>
>>> > >>> Okay, so this is just a way to choose an alternative main()
>>> > >>> function.
>>> > >>
>>> > >> Am I missing something important here? What's special about naming
>>> > >> a function "main"? Don't you still have to do something else to
>>> > >> invoke it from the cli, such as calling it expressly in the module
>>> > >> or pointing console entry points to it?
>>> > >>
>>> > >> ```
>>> > >> $ echo 'def main(): print("hi")' > xyz.py
>>> > >> $ python -m xyz
>>> > >> <no output>
>>> > >> $
>>> > >> ```
>>> > >>
>>> > >> I'm kind of meh at this point, I'll leave it to the usual
>>> > >> crowd. :-)
>>> > >>>
>>> > >>
>>> > >> I appreciate the engagement you've given this already. :)
>>> > >>
>>> > >> --
>>> > >>> --Guido van Rossum (python.org/~guido)
>>> > >>> *Pronouns: he/him **(why is my pronoun here?)*
>>> > >>> <
>>> http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/
>>> >
>>> > >>>
>>> > >> --
>>> > > --Guido (mobile)
>>> > >
>>>
>>>
>>>
>>> --
>>> Best regards,
>>>  Paul                          mailto:pmis...@gmail.com
>>>
>> _______________________________________________
>>> Python-ideas mailing list -- python-ideas@python.org
>>> To unsubscribe send an email to python-ideas-le...@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/7RFFX3PPJFT4HJY5ODBLZLYR2BDVFQRE/
>>
>>
>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>
>>
>>
>> --
>> Christopher Barker, PhD
>>
>> Python Language Consulting
>>   - Teaching
>>   - Scientific Software Development
>>   - Desktop GUI and Web Development
>>   - wxPython, numpy, scipy, Cython
>>
> _______________________________________________
> Python-ideas mailing list -- python-ideas@python.org
> To unsubscribe send an email to python-ideas-le...@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/DFG3KWDKAT2AO2BIMVO6FNHOTFNLDDF2/
> Code of Conduct: http://python.org/psf/codeofconduct/
>


-- 
The dead increasingly dominate and strangle both the living and the
not-yet born.  Vampiric capital and undead corporate persons abuse
the lives and control the thoughts of homo faber. Ideas, once born,
become abortifacients against new conceptions.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@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/HHIJY64IFYHIDOGTEUSP3OJN7SISBSP6/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to