Seite 1 von 1

Keine Heredocs in Python (oder?)

Verfasst: Dienstag 18. April 2006, 00:39
von murphy
hallo Pythons!

Python fehlt das verwirrende feature der Heredocs, was völlig logisch ist, wenn man die designphilosophie bedenkt.

nun, ich vermute auch, dass die meisten fälle mit den '''-strings abgedeckt sind. aber eben sah ich mich außer stande, eine sehr einfache sache mit Python zum laufen zu bringen, und zwar:
  • ich habe mir die neueste version von PyYAML heruntergeladen und installiert. tolles projekt.
  • dann wollte ich die Reference Card von yaml.org ausprobieren - der veraltete Ruby-YAML-Parser schafft die nicht.
  • also probierte ich

    Code: Alles auswählen

    >>> import yaml
    >>> doc = '''
    und wollte dann einfach per Copy&Paste den code hineinkopieren. klappte nicht (weil ein ''' vorkommt.)
    auch mit triple-double-quotes kein erfolg.
also muss ich wohl eine datei einlesen. oder hat jemand eine bessere idee?

im vergleich dazu geht das in Ruby mit irb problemlos:

Code: Alles auswählen

irb(main):001:0> require 'yaml'
=> true
irb(main):008:0> refcard = <<'YAML'
[ reinkopieren ]
irb(main):071:0' YAML
=> "%YAML 1.1   # Reference card\n---\nCollection indicators:\n     '? ' : Key indicator.\n usw.
irb(main):072:0> YAML.load(refcard)
=> "%YAML 1.1"
dafür versteht der doofe YAML-parser nicht mal die YAML-Direktive ;)

bitte sagt mir, dass das in Python auch irgendwie geht. gibt es einen hack, um heredocs zu imitieren?

Verfasst: Dienstag 18. April 2006, 02:39
von Leonidas
Ich werd jetzt nicht über Pro- und Contra-Heredocs streiten, aber ich sag dir wie man die Reference Card einlesen kann:

Code: Alles auswählen

>>> ref = r"""[Strg+V/Rechtsklick in SSH-Fenster]
"""
>>> # done
>>> len(ref)
2569
Also, ich habe einen Tripple-Quote-String mit doppelten Anführungszeichen benutzt und zudem den als Raw-String deklariert. Warum letzteres? Weil Python sonst versucht, die \xXX-Codes in der Reference-Card zu parsen, aber da \xXX kein gültiger Wert ist, schlägt das fehl.
Als Raw-String ist es hingegen kein Problem.

Viel Spaß mit PyYAML, ich hoffe mal PyYAML 3000 ist besser als das phänomenal kaputte PyYAML, an welches ich mich erinnern kann :) (deswegen fand ich so toll, das Syck in Ruby 1.8 mitgeliefert wird).

Verfasst: Mittwoch 19. April 2006, 16:30
von murphy
achso, es gibt gar keinen unterschied zwischen ''' und """, aber ein r verhindert die interpretation. ok. danke!