I can't think of a case where the check for "\n" would result in a false
negative. It likely makes sense to do that to keep python startup as
lightweight as possible.

I've made a PR that implements a proof-of-concept:
https://github.com/python/cpython/pull/103998

It's currently done via the Python C-API, but in terms of keeping things
lightweight, I might need some help on how to effectively use the wide
c-string API to implement this.


On Mon, Apr 10, 2023 at 4:46 AM Barry <ba...@barrys-emacs.org> wrote:

>
>
> On 10 Apr 2023, at 02:18, Jonathan Crall <erote...@gmail.com> wrote:
>
> 
> There's no question that there are lots of ways you can work around the
> issue (I think the `if 1:` method is the easiest and most portable, but it
> still is boilerplate which can be confusing if you don't know why it's
> there). The question is: would enough people benefit from this to add the
> feature to CPython?
>
>
> A PR that has an implementation might push this forward.
> I wonder if in the C code of -c treating a string that starts with \n
> could trigger the dedent?
>
> Barry
>
>
>
>
> On Sun, Apr 9, 2023 at 4:09 PM Barry Scott <ba...@barrys-emacs.org> wrote:
>
>>
>> On 04/04/2023 15:18, Jonathan Crall wrote:
>>
>> I have what I think is a fairly low impact quality of life improvement to
>> suggest for the python CLI.
>>
>> When I'm not working in Python I tend to be working in bash. But often I
>> want to break out and do something quick in Python. I find the `python -c `
>> CLI very useful for this. For one liners it's perfect. E.g.
>>
>> NEW_VAR=$(python -c "import pathlib;
>> print(pathlib.Path('$MYVAR').parent.parent)")
>>
>> And even if I want to do something multi-line it's pretty easy
>>
>> NEW_VAR=$(python -c "
>> import pathlib
>> for _ in range(10):
>>     print('this is a demo, bear with me')
>> ")
>>
>> But the problem is when I'm writing bash inside a function or some other
>> nested code, I would like to have nice indentation in my bash file, but if
>> I write something like this:
>>
>> mybashfunc(){
>>     python -c "
>>     import pathlib
>>     for _ in range(10):
>>         print('this is a demo, bear with me')
>>     "
>> }
>>
>> I get `IndentationError: unexpected indent`.
>>
>> This means I have to write the function ugly like this:
>>
>> mybashfunc(){
>>     python -c "
>> import pathlib
>> for _ in range(10):
>>     print('this is a demo, bear with me')
>> "
>> }
>>
>> Or use a helper function like this:
>>
>> codeblock()
>> {
>>     __doc__='
>>     copy-pastable implementation
>>     Prevents indentation errors in bash
>>     '
>>     echo "$1" | python -c "import sys; from textwrap import dedent;
>> print(dedent(sys.stdin.read()).strip('\n'))"
>> }
>>
>> mybashfunc(){
>>     python -c $(codeblock "
>>     import pathlib
>>     for _ in range(10):
>>         print('this is a demo, bear with me')
>>     ")
>> }
>>
>> Or more recently I found that this is a low-impact workaround:
>>
>> mybashfunc(){
>>     python -c "if 1:
>>     import pathlib
>>     for _ in range(10):
>>         print('this is a demo, bear with me')
>>     "
>> }
>>
>> But as a certain Python dev may say: "There must be a better way."
>>
>> Would there be any downside to the Python CLI automatically dedenting the
>> input string given to -c? I can't think of any case off the top of my head
>> where it would make a previously valid program invalid. Unless I'm missing
>> something this would strictly make previously invalid strings valid.
>>
>> Thoughts?
>>
>> You can solve this with a small module. I named mine run_dedent
>>
>> mkdir -p run_dedent
>> echo pass >run_dedent/__init__.py
>> cat <<EOF >run_dedent/__main__.py
>> import sys
>> import textwrap
>> cmd = textwrap.dedent(sys.argv[1])
>> exec(cmd)
>> EOF
>>
>>     python3 -m run_dedent "
>>         import sys
>>         print(sys.version_info)
>>         "
>>
>> Barry
>>
>>
>>
>> --
>> -Dr. Jon Crall (him)
>>
>> _______________________________________________
>> Python-ideas mailing list -- python-ideas@python.org
>> To unsubscribe send an email to 
>> python-ideas-leave@python.orghttps://mail.python.org/mailman3/lists/python-ideas.python.org/
>> Message archived at 
>> https://mail.python.org/archives/list/python-ideas@python.org/message/6SYN2MQIP5DTF6INZ4SP2YKLF6P4VJOW/
>> Code of Conduct: http://python.org/psf/codeofconduct/
>>
>>
>
> --
> -Dr. Jon Crall (him)
>
>

-- 
-Dr. Jon Crall (him)
_______________________________________________
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/2GGM2J7D2MUMPKOEM45ZQEWRHI2QMN6Q/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to