Python als Makroersatz, und was zum Lachen
Gegeben einen C-Header, der aus Zeug wie dem folgenden besteht: DECLARE_STRING(IDS_XYZ_STATUS_BUSY, "Busy") DECLARE_STRING(IDS_XYZ_STATUS_COVER_OPEN, "Cover open") DECLARE_STRING(IDS_XYZ_STATUS_DOOR_OPEN, "Door open") ....(usw, viele hundert Zeilen lang)... möchte ich eine Datei erzeugen, die so ausschaut: [IDS_XYZ_STATUS_BUSY] "Busy" [IDS_XYZ_STATUS_COVER_OPEN] "Cover open" [IDS_XYZ_STATUS_DOOR_OPEN] "Door open"... Dachte ich mir, kopierst du den Auszug in ein Pythonscript und schreibst def DECLARE_STRING(irgendwas, blabla): aber das ist ein Schmarrn, weil, die IDs sind nicht natürlich - äh - natürlich nicht definiert. Nun bin ich ja, die Herren Gläubigen des Templategötzens mögen es mir verzeihen, Senior-Makrologe und schreibe gerne Sachen wie #ifdef IMPORT_BUILD #define DECLARE_STRINGS(__NAME__,__CONTENT__) \ extern const char* __NAME__; #else #define DECLARE_STRINGS(__NAME__,__CONTENT__) \ const char* __NAME__ = __CONTENT; #endif Nun heisst es ja immer, mit Python könne man alles Makromäßige umsetzen - wie aber mache ich sowas? Ich will ja praktisch auf der Fliege ("on the fly"), neue Variablen erzeugen. Wäre es möglich, sich in den Name Lookup der Variablen zu hängen, so daß man z.B. bei Undeclared Identifier die Möglichkeit hat, sich 'ne neue anzuschaffen? Zum lachen: Guckst du Google, suche nach Q246772, klickst du auf die MSDN-Seite. HOWTO: Retrieve and Set the Default Printer in Windows Beachte - die Länge des Beispielcodes im Vergleich zur schier unglaublichen!!!!!!!!1! Schwere der Aufgabe - und, vor allem, die Anmerkungen zum Code darunter _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Gerson Kurz wrote:
Gegeben einen C-Header, der aus Zeug wie dem folgenden besteht:
DECLARE_STRING(IDS_XYZ_STATUS_BUSY, "Busy") DECLARE_STRING(IDS_XYZ_STATUS_COVER_OPEN, "Cover open") DECLARE_STRING(IDS_XYZ_STATUS_DOOR_OPEN, "Door open") ....(usw, viele hundert Zeilen lang)...
möchte ich eine Datei erzeugen, die so ausschaut:
[IDS_XYZ_STATUS_BUSY] "Busy"
[IDS_XYZ_STATUS_COVER_OPEN] "Cover open"
[IDS_XYZ_STATUS_DOOR_OPEN] "Door open"...
Dachte ich mir, kopierst du den Auszug in ein Pythonscript und schreibst
def DECLARE_STRING(irgendwas, blabla): [...]
Nun heisst es ja immer, mit Python könne man alles Makromäßige umsetzen - wie aber mache ich sowas? Ich will ja praktisch auf der Fliege ("on the fly"), neue Variablen erzeugen.
__getattr__/__setattr__ geht leider (oder zum Glück) auf Modulebene nicht, nur auf Klassenebene.
Wäre es möglich, sich in den Name Lookup der Variablen zu hängen, so daß man z.B. bei Undeclared Identifier die Möglichkeit hat, sich 'ne neue anzuschaffen?
Zum lachen: Guckst du Google, suche nach Q246772, klickst du auf die MSDN-Seite. HOWTO: Retrieve and Set the Default Printer in Windows [...]
Argh, dann lieber doch "import win32print" ;-) -- Gerhard _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Gerhard Häring wrote:
Gerson Kurz wrote:
Gegeben einen C-Header, der aus Zeug wie dem folgenden besteht:
DECLARE_STRING(IDS_XYZ_STATUS_BUSY, "Busy") DECLARE_STRING(IDS_XYZ_STATUS_COVER_OPEN, "Cover open") DECLARE_STRING(IDS_XYZ_STATUS_DOOR_OPEN, "Door open") ....(usw, viele hundert Zeilen lang)...
möchte ich eine Datei erzeugen, die so ausschaut:
[IDS_XYZ_STATUS_BUSY] "Busy"
[IDS_XYZ_STATUS_COVER_OPEN] "Cover open"
[IDS_XYZ_STATUS_DOOR_OPEN] "Door open"...
Dachte ich mir, kopierst du den Auszug in ein Pythonscript und schreibst
def DECLARE_STRING(irgendwas, blabla): [...]
Nun heisst es ja immer, mit Python könne man alles Makromäßige umsetzen - wie aber mache ich sowas? Ich will ja praktisch auf der Fliege ("on the fly"), neue Variablen erzeugen.
__getattr__/__setattr__ geht leider (oder zum Glück) auf Modulebene nicht, nur auf Klassenebene.
import bla bla.__dict__["test"] = "bla" print bla. bla.__class__ bla.__file__ bla.__name__ bla.__setattr__ bla.__delattr__ bla.__getattribute__ bla.__new__ bla.__str__ bla.__dict__ bla.__hash__ bla.__reduce__ bla.test bla.__doc__ bla.__init__ bla.__repr__ print bla. bla.printattr() test printattr __builtins__ __name__ __file__ __doc__
printattrs gibt einfach globals() aus. globals()[var] = value ? globals()["test"] = "bla" grüsse daniel _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Zum lachen: Guckst du Google, suche nach Q246772, klickst du auf die MSDN-Seite.
HOWTO: Retrieve and Set the Default Printer in Windows
Beachte
- die Länge des Beispielcodes im Vergleich zur schier unglaublichen!!!!!!!!1! Schwere der Aufgabe
- und, vor allem, die Anmerkungen zum Code darunter
Immerhin unterstützt dieser Code auch sehr viele Windowsversionen. Wenn man nur noch aktuelle braucht, reicht dieses:
from ctypes import *
buf = c_buffer(256) dword = c_ulong(sizeof(buf)) windll["winspool.drv"].GetDefaultPrinterA(byref(buf), byref(dword)) print buf.value \\SERVER\Lexmark Optra S1255 PS
Thomas _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Am Wed, 30 Jul 2003 17:07:15 +0200 Schrieb Gerson.Kurz@t-online.de (Gerson Kurz):
Gegeben einen C-Header, der aus Zeug wie dem folgenden besteht:
DECLARE_STRING(IDS_XYZ_STATUS_BUSY, "Busy") DECLARE_STRING(IDS_XYZ_STATUS_COVER_OPEN, "Cover open") DECLARE_STRING(IDS_XYZ_STATUS_DOOR_OPEN, "Door open") ....(usw, viele hundert Zeilen lang)...
möchte ich eine Datei erzeugen, die so ausschaut:
[IDS_XYZ_STATUS_BUSY] "Busy"
[IDS_XYZ_STATUS_COVER_OPEN] "Cover open"
[IDS_XYZ_STATUS_DOOR_OPEN] "Door open"...
#!/usr/bin/env python import sys, xreadlines if len(sys.argv) == 1 or sys.argv[1] in ["-h", "--help"]: print "usage : %s infile [outfile]" (sys.argv[0]) sys.exit(0) if len(sys.argv) == 3: out = open(sys.argv[2]) else: out = sys.stdout hfile = open(sys.argv[1]) for line in xreadlines.xreadlines(hfile): if line.find("DECLARE_STRING(") >= 0: p1 = line.find("(")+1 p2 = line.find(",") p3 = line.find('"',p2) p4 = line.find('"',p3+1)+1 out.write("["+(line[p1:p2].strip())+"]\n") out.write(line[p3:p4]+"\n\n") hfile.close() if out != sys.stdout: out.close()
Dachte ich mir, kopierst du den Auszug in ein Pythonscript und schreibst
def DECLARE_STRING(irgendwas, blabla):
aber das ist ein Schmarrn, weil, die IDs sind nicht natürlich - äh - natürlich nicht definiert. Nun bin ich ja, die Herren Gläubigen des Templategötzens mögen es mir verzeihen, Senior-Makrologe und schreibe gerne Sachen wie
#ifdef IMPORT_BUILD
#define DECLARE_STRINGS(__NAME__,__CONTENT__) \ extern const char* __NAME__;
#else
#define DECLARE_STRINGS(__NAME__,__CONTENT__) \ const char* __NAME__ = __CONTENT;
#endif
Nun heisst es ja immer, mit Python könne man alles Makromäßige umsetzen
wie aber mache ich sowas? Ich will ja praktisch auf der Fliege ("on the fly"), neue Variablen erzeugen.
Wäre es möglich, sich in den Name Lookup der Variablen zu hängen, so daß man z.B. bei Undeclared Identifier die Möglichkeit hat, sich 'ne neue anzuschaffen?
Du könntest ein (temporäres) Modul ins aktuelle Verzeichnis schreiben lassen, mit den Deklarationen, z.B. 'IDS_XYZ_STATUS_BUSY = "Busy"' und dieses Modul dann importieren mit "from declarations import *" Gruß Fritz _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Am Wed, 30 Jul 2003 19:46:06 +0200 Schrieb Fritz Cizmarov <fritz@sol.at>:
Du könntest ein (temporäres) Modul ins aktuelle Verzeichnis schreiben lassen, mit den Deklarationen, z.B. 'IDS_XYZ_STATUS_BUSY = "Busy"' und dieses Modul dann importieren mit "from declarations import *"
es geht auch direkt über locals()
locals()["neue_variable"] = "Test" print neue_variable Test
Fritz _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Gerson Kurz <Gerson.Kurz@t-online.de> wrote:
Gegeben einen C-Header, der aus Zeug wie dem folgenden besteht:
DECLARE_STRING(IDS_XYZ_STATUS_BUSY, "Busy") DECLARE_STRING(IDS_XYZ_STATUS_COVER_OPEN, "Cover open") DECLARE_STRING(IDS_XYZ_STATUS_DOOR_OPEN, "Door open") ....(usw, viele hundert Zeilen lang)...
Wenn die Zeilen wirklich so sauber gleichmäßig formatiert sind, kannst Du das sicher mit einer Regex erschlagen, ungefähr (ungetestet) r'DECLARE_STRING\((?P<name>\w+),\s*"(?P<value>(\w|\s)+)"\)' Evtl. noch ein paar \s* einstreuen, um redundante Blanks wegzufangen. Wenn aber alle (Un-)Schönheiten der C-Makrosyntax genutzt werden, ist diese Methode nicht so toll. Detlef _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (6)
-
daniel.poelzleithner
-
Detlef Lannert
-
Fritz Cizmarov
-
Gerhard Häring
-
Gerson.Kurz@t-online.de
-
Thomas Heller