Just to be clear on my opinion. I think Emil's idea was 100% appropriate to
share on python-ideas, and he does a good job of showing where it works be
useful. Sure, a background search is nice, but not required.

That doesn't mean I *support* the idea. I take a very conservative attitude
towards language changes. I hope I've provided okay explanation of my
non-support, but it's NOT a criticism of Emil in any way.

That said, Jim Baker pitched his similar idea to my at last PyCon, and I
remember coming closer to feeling supportive. Maybe partially just because
I know and like Jim for a long time. But I think he was also suggesting
some extra semantics that seemed to move the needle in my mind.

On Sat, Dec 17, 2022, 2:27 PM Eric V. Smith via Python-ideas <
python-ideas@python.org> wrote:

> Jim Baker has been working on tagged strings, and Guido has a working
> implementation. See https://github.com/jimbaker/tagstr/issues/1
>
> I thought Jim had a draft PEP on this somewhere, but I can’t find it.
>
> --
> Eric
>
> On Dec 17, 2022, at 11:14 AM, e...@emilstenstrom.se wrote:
>
> Hi everyone!
>
> I'm the maintainer of a small django library called django-components.
> I've run into a problem that I have a language-level solution (tagged
> strings) to, that I think would benefit the wider python community.
>
> *Problem*
> A component in my library is a combination of python code, html, css and
> javascript. Currently I glue things together with a python file, where you
> put the paths to the html, css and javascript. When run, it brings all of
> the files together into a component. But for small components, having to
> juggle four different files around is cumbersome, so I've started to look
> for a way to put everything related to the component _in the same file_.
> This makes it much easier to work on, understand, and with fewer places to
> make path errors.
>
> Example:
> class Calendar(component.Component):
>    template_string = '<span class="calendar"></span>'
>    css_string = '.calendar { background: pink }'
>    js_string = 'document.getElementsByClassName("calendar)[0].onclick =
> function() { alert("click!") }'
>
> Seems simple enough, right? The problem is: There's no syntax highlighting
> in my code editor for the three other languages. This makes for a horrible
> developer experience, where you constantly have to hunt for characters
> inside of strings. You saw the missing quote in js_string right? :)
>
> If I instead use separate files, I get syntax highlighting and
> auto-completion for each file, because editors set language based on file
> type. But should I really have to choose?
>
> *Do we need a python language solution to this?*
> Could the code editors fix this? There's a long issue thread for vscode
> where this is discussed: https://github.com/Microsoft/vscode/issues/1751
> - The reasoning (reasonable imho) is that this is not something that can be
> done generally, but that it needs to be handled at the python vscode
> extension level. Makes sense.
>
> Could the vscode language extension fix this? Well, the language extension
> has no way to know what language it should highlight. If a string is HTML
> or CSS. PyCharm has decided to use a "special python comment" #
> language=html that makes the next string be highlighted in that language.
>
> So if just all editors could standardize on that comment, everything would
> work? I guess so, but is that really the most intuitive API to standardize
> around? If the next statement is not a string, what happens? If the comment
> is on the same line as another statement, does it affect that line, or the
> next? What if there's a newline in between the comment in the string, does
> that work?
>
> *Suggested solution*
> I suggest supporting _tagged strings_ in python. They would look like
> html'<span class="calendar"></span>'.
> * Python should not hold a list of which tagged strings it should support,
> it should be possible to use any tag.
> * To avoid clashes with current raw strings and unicode strings, a tag
> should be required to be at least 2 characters long (I'm open to other ways
> to avoid this).
>
> I like this syntax because:
> 1. It's clear what string the tag is affecting.
> 2. It makes sense when you read it, even though you've never seen the
> syntax before.
> 3. It clearly communicates which language to highlight to code editors,
> since you can use the language identifiers that already exist:
> https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers
> - for single letter languages, which are not supported to avoid clash with
> raw strings and unicode strings, the language extension would have to
> support "r-lang" and "c-lang" instead.
> 4. It mimics the syntax of tagged string templates in javascript (
> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates).
> So it has som precedent.
>
> (If desirable, I think mimicing javascript further and making tagged
> strings call a function with the tag's name, would be a great addition to
> Python too. This would make the syntax for parsing foreign languages much
> nicer. But this is not required for my specific problem, it's just a nice
> next possible step for this feature.)
>
> *Backwards compatibility*
> This syntax currently raises a invalid syntax error. So introducing this
> shouldn't break existing programs. Python's currently supported string
> types are just single letter, so the suggestion is to require tagged
> strings to be at least two letters.
>
> *Feedback?*
> What are your thoughts on this? Do you see a value in adding tagged
> strings to python? Are there other use-cases where this would be useful?
> Does the suggestion need to support calling tags as functions like in
> javascript to be interesting?
>
> (I'm new to python-ideas, so I hope I haven't broken some unspoken rule
> with this suggestion.)
>
> --
> Emil Stenström
> _______________________________________________
> 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/OXHQHMV2JC2PY7K63VNIMSTP5T46LPKT/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
> _______________________________________________
> 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/EBCW3OQNASEIRNDETTDWCQYKWWNZXZY5/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
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/AFSKAMETZPT3IN422N6TMIAIVTBGRAS2/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to