Seite 1 von 1

Python one-liner

Verfasst: Sonntag 3. August 2008, 00:40
von Crazed
Hallo :)!

Ich bin auf den Geschmack gekommen Python "one-liner" (Scripte die nur aus einer einzigen Zeile code bestehen) zu schreiben als ich mit meinem irc-bot herumexperimentiert habe, der ein kommando namens !exec unterstützt das mir erlaubt direkt Python Code auszuführen.

Z.b habe ich mir so den Google-quelltext schicken lassen:

Code: Alles auswählen

!exec import mechanize;connection.privmsg(event.source().split('!')[0], mechanize.Browser().open('http://www.google.de').read())
output:
<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style>body,td,a,p,.h{font-family:arial,sans-serif}.h{font-size:20px}.h{color:#3366cc}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}.lnc:link,.lnc:visited{color:#00c}.pgtab,.pgtab:hover,.pgtabselected,.pgtabside{text-align:center;text-decoration:none;color:#00c;display:block;height:27px;float:left;overflow:hidden;backgro...
Jetzt kann man ja sogar Funktions definitionen mit einem one-liner machen.

Code: Alles auswählen

def test():print 'Hello World';print 'Second Line';return True
Leider kann man jetzt die Funktion nicht am ende mittels test() aufrufen da test() noch im Scope der Funktionsdefinition steht (glaube ich). Gibts da nen work-around?

EDIT: So gehts:

Code: Alles auswählen

In [1]: exec("def test():print 'Hello';print 'World';return True");test()
Hello
World
Out[1]: True
Ist zwar alles andere als schön aber es geht :), soll ja nen "dirty" one-liner sein ^^.


PS: Kennt ihr noch lustige, unmöglich kompliziert/lange/nützliche One-Liner? Wenn ja würde ich mich freuen wenn ihr sie mir vorstellen würdet.

MfG,
CracKPod

Verfasst: Sonntag 3. August 2008, 02:23
von Trundle
Da hätte ich

Code: Alles auswählen

(lambda x,k=''.join(map(chr,range(65,91)+range(97,123)+range(48,58)))+
'+/=',o=['']:(lambda x=x.strip():(map(lambda i,x=x:o.__setitem__(0,o[0].__add__
(''.join(map(lambda x:x!=64 and chr(x)or '',map(lambda b:((b[0]<<2)|(b[1]>>4),(
(b[1]&15)<<4)|(b[2]>>2),((b[2]&3)<<6)|b[3]),[map(lambda c:k.index(c),x[i:i+4])]
)[0])))),range(0,len(x),4)),x.endswith('==')and[o[0][:-1]]or o[:],o.__setitem__
(0,'')))()[1][0])('RGFzIGtvZW5udGUgbWFuIGFsbGVzIGluIGVpbmVyIFplaWxlIHNjaHJlaWJ'
'lbiB1bmQgaXN0IGV2YWwtZmFlaGlnLg==')
im Angebot (warum auch immer ich das einmal geschrieben habe). Geht aber bestimmt noch kürzer und erheblich schöner und ist wahrscheinlich auch nicht bugfrei.

Verfasst: Sonntag 3. August 2008, 11:10
von Crazed
Ehrm. Was machst es denn? *Ehrfurcht* ^^
Steckt auf jeden Fall ein bisschen base64 mit drin. Decodiert es den base64 string?

Verfasst: Sonntag 3. August 2008, 11:39
von EyDu
Eine Einzeiler der Anweisungen durch Semikolons trennt ist wirklich kein echter Einzeiler mehr. Dann könnte man jedes Programm in nur eine Zeile quetschen.

"Google-Quelltext" finde ich aber echt niedlich :P

Verfasst: Sonntag 3. August 2008, 11:59
von Leonidas
EyDu hat geschrieben:Eine Einzeiler der Anweisungen durch Semikolons trennt ist wirklich kein echter Einzeiler mehr. Dann könnte man jedes Programm in nur eine Zeile quetschen.
Vor allem mit Java ist das sehr einfach, wo man nur die ``\n`` weglassen muss. Aber das ist nicht sonderlich elegant und Einzeiler sollten schon etwas elegantes an sich haben.

Verfasst: Sonntag 3. August 2008, 15:37
von EyDu
Wie immer geht es auch ohne exec:

Code: Alles auswählen

>>> reduce((lambda x,y: (__import__("sys").stdout.write(x+"\n"), y)[1]), ("hallo", "welt", True))
hallo
welt
True
>>>

Code: Alles auswählen

>>> (map(lambda x:__import__("sys").stdout.write(x+"\n"), ("hallo", "welt")), True)[1]
hallo
welt
True
>>> 

Verfasst: Sonntag 3. August 2008, 16:00
von lunar
Was wohl Tim Peters dazu sagen würde?

Verfasst: Sonntag 3. August 2008, 23:27
von Trundle
Crazed hat geschrieben:Decodiert es den base64 string?
Ja (sollte es zumindest).

Verfasst: Mittwoch 13. August 2008, 11:48
von Y0Gi
Crazed hat geschrieben:Ehrm. Was machst es denn? *Ehrfurcht* ^^
Steckt auf jeden Fall ein bisschen base64 mit drin. Decodiert es den base64 string?
Ich hatte erst an rot13 gedacht (``some_string.decode('rot13')``), doch dafür war es etwas lang. Auf base64 bin ich durch das verräterische `==` am Ende des Strings gekommen. Und ja, es funktioniert (für den gegebenen String).

Zugegeben, eine bestehende Funktionalität hätte ich wohl nicht neu implementiert ;)