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?


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)
_______________________________________________
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/SEEFXCSRLIDETQFYKULS6EVK3U4AXKSF/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to