WikedPad unter Linux zum laufen bringen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
albertus
User
Beiträge: 52
Registriert: Mittwoch 7. Juli 2010, 14:48

Freitag 18. März 2011, 10:30

Guten Morgen,

bei der Suche nach einem kleinen Wiki für den Hausgebrauch bin ich auf WikidPad http://trac.wikidpad2.webfactional.com gestoßen leider bricht WikedPad beim starten mit folgender Meldung ab:

Code: Alles auswählen

Traceback (most recent call last):
File "WikidPadStarter.py", line 18, in <module>
__builtins__["N_"] = N_
TypeError: 'module' object does not support item assignmen
Keine Ahnung warum der Autor folgende Funktion unbedingt dem Modul __builtins__ hinzufügen will, eigentlich macht man so was ja nicht.

Code: Alles auswählen

# Dummies for localization
def N_(s):
    return s
__builtins__["N_"] = N_
del N_


__builtins__["_"] = N_
Wie dem auch sei, ein Modul unterstützt kein item assignmen, trotzdem muss ich diese Funktion in __builtins__ einfügen, will ich nicht das ganze Programm nach "N_" durchforsten um die Funktion dort einzubauen. Leider habe ich keine Ahnung wie man das bewerkstelligen kann. Kann mir da jemand weiterhelfen?
Mit freundlichen Grüßen

Albertus
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Freitag 18. März 2011, 10:32

schon gelesen: Issues under Linux?
I'm not getting paid for being Mr. Nice Guy!
BlackJack

Freitag 18. März 2011, 11:01

@albertus: Wenn es sich da tatsächlich um das Modul handeln sollte, dann ist das nicht nur falsch weil Modulobjekte kein "item assignment" erlauben, sondern auch weil `__builtins__` ein Implementierungsdetail ist. Den Namen muss es überhaupt nicht geben.

Und wie kann man denn ein paar Zeilen nach einem ``del N_`` auf den Namen noch zugreifen? Das kann doch auch nicht gehen!?

So wäre das robuster:

Code: Alles auswählen

import __builtin__
def identity(obj):
    return obj
setattr(__builtin__, 'N_', identity)
setattr(__builtin__, '_', identity)
albertus
User
Beiträge: 52
Registriert: Mittwoch 7. Juli 2010, 14:48

Freitag 18. März 2011, 11:02

querdenker hat geschrieben:schon gelesen: Issues under Linux?
Bis eben nicht allerdings habe ich gerade gesehen das in der Version 2.1rc1_1 der Fehler behoben wurde. dort steht:

Code: Alles auswählen

def N_(s):
    return s
__builtin__.N_ = N_
del N_


__builtin__._ = N_
das ließ sich leicht in die Version 2.0 einbauen. Leider Funktioniert WikedPad mit meiner OpenSuse immer noch nicht. Jetzt erscheint kein Fenster, keine Meldung, das Programm mach nach den Start einfach nichts mehr! Ich denke das ich das Programm löschen werde .
Mit freundlichen Grüßen

Albertus
albertus
User
Beiträge: 52
Registriert: Mittwoch 7. Juli 2010, 14:48

Freitag 18. März 2011, 11:06

BlackJack hat geschrieben:@albertus: Wenn es sich da tatsächlich um das Modul handeln sollte, dann ist das nicht nur falsch weil Modulobjekte kein "item assignment" erlauben, sondern auch weil `__builtins__` ein Implementierungsdetail ist. Den Namen muss es überhaupt nicht geben.

Und wie kann man denn ein paar Zeilen nach einem ``del N_`` auf den Namen noch zugreifen? Das kann doch auch nicht gehen!?
Er löscht den Namen "N_" aus dem Modul WikidPadStarter.py das Code Objekt existiert ja weiter weil es noch ein Verweis in __builtins__ auf selbiges gibt.
Mit freundlichen Grüßen

Albertus
BlackJack

Freitag 18. März 2011, 11:09

@albertus: Ah stimmt, da habe ich nicht dran gedacht. :oops:
deets

Freitag 18. März 2011, 22:53

Aaaaalso, warum man das ganze ueberhaupt macht hat schon nen guten Grund. Bei N_ (und vielmehr noch bei _) handelt es sich um Funktionen, die von gettext verwandt werden, um Texte zur Laufzeit zu uebersetzen.

Warum muessen die jetzt in das __builtins__ gepruegelt werden? Ganz einfach - wenn man viele Module verschiedener Herkunft verwendet, dann muessen die ja alle auf dieselbe Funktion zurueckgreifen fuer die Uebersetzung. Theoretisch koennten sie das dadurch, das man in jedem Modul immer sowas wie "from gettext import translate as _" einbaut. Das hat man aber wohl als nervig empfunden. Deswegen bietet schon das gettext-modul selbst eine Funktion, den builtins-namespace "anzureichern":

http://docs.python.org/library/gettext. ... xt.install

Und ausserdem haette man dann ein Problem: die Implementation waere festgelegt. Das ist oft egal, aber zB im Fall von TurboGears/Pylons/formencode waere das katastrophal, denn dort werden die Uebersetzungs-Kataloge je nach eingehendem Request und dessen Spracheinstellungen transparent "umgebogen".

Es ist insgesamt ein etwas ekliges Thema, und haette bestimmt auch besser geloest werden koennen, indem man gettext einfach beibringt, fuer _ eine Registry/Factory zu benutzen, die einfach von einem Programm konfiguriert wird. Aber es ist wie es ist...
Antworten