Schwarzer Gürtel in Python

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.
Apfelbox
User
Beiträge: 4
Registriert: Montag 8. Oktober 2007, 08:30

Hallo

Ich habe letztens diesen Link von nem Kumpel geschickt bekommen: http://www.javablackbelt.com/

Ich habe mich gefragt ob vielleicht irgendwer sowas ähnliches für Python kennt. Fände ich lustig und ein ansporn zum weiter coden =)

greets Apfelbox
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Apfelbox hat geschrieben:Ich habe letztens diesen Link von nem Kumpel geschickt bekommen: http://www.javablackbelt.com/
Sehe ich das richtig? Das sind Zertifikate die man bekommt, dass man übermäßig verkomplizierte Technologien kennt und nutzen kann? Also etwa EJB, JMX, JNDI, JMS, JDBC, JTA, JAAS, JAXB, JAXP, JAXR, JACC, JCA, JAF, JPA und JSTL kennt und benutzen kann? (Jeder der Zope3 kompliziert findet sollte mal in Wikipedia J2EE ansehen)
Apfelbox hat geschrieben:Ich habe mich gefragt ob vielleicht irgendwer sowas ähnliches für Python kennt. Fände ich lustig und ein ansporn zum weiter coden =)
Nein, sowas ist mir nicht bekannt. Für mich wäre ein Ansporn zum Coden etwas zu kennen/können was andere Regulars in dem Forum hier nicht können. Ist aber gar nicht so leicht, wie man denken könnte.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Der Nachteil von Python ─ es ist einfach zu leicht; die APIs zu durchschaubar. Kein Stoff für Zertifikate mit denen die einen Geld verdienen und die anderen sich brüsten können. ;-)
Apfelbox
User
Beiträge: 4
Registriert: Montag 8. Oktober 2007, 08:30

Danke für die Antworten.

Das Python zu einfach sit ist wahr aber ich fänd es trotzdem eine witzige Idee.

Apfelbox
Gromit
User
Beiträge: 51
Registriert: Montag 8. Mai 2006, 19:07

Leonidas hat geschrieben:Also etwa EJB, JMX, JNDI, JMS, JDBC, JTA, JAAS, JAXB, JAXP, JAXR, JACC, JCA, JAF, JPA und JSTL kennt und benutzen kann? (Jeder der Zope3 kompliziert findet sollte mal in Wikipedia J2EE ansehen)
Leonidas ist der Master of Buzzword Desaster!
BlackJack

Ist dass denn so schwer? Ich habe jedenfalls den Eindruck wenn man eine beliebige Kombination von zwei oder drei Buchstaben nimmt und ein 'J' vorne anstellt, hat man mit ziemlicher Sicherheit den Namen von irgendeiner Java-Technik oder -Spezifikation. ;-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Man beachte die Ursprünge der Namen von Programmiersprachen:

Python -> Monty Python -> macht Spaß

Java -> Kaffee -> ist ungesund, macht nervös, abhängig und hohen Blutdruck

Ruby -> Edelstein -> ist nicht alles Gold was glänzt ;)
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Gromit hat geschrieben:
Leonidas hat geschrieben:Also etwa EJB, JMX, JNDI, JMS, JDBC, JTA, JAAS, JAXB, JAXP, JAXR, JACC, JCA, JAF, JPA und JSTL kennt und benutzen kann? (Jeder der Zope3 kompliziert findet sollte mal in Wikipedia J2EE ansehen)
Leonidas ist der Master of Buzzword Desaster!
Jo, Copy & Paste :D
Y0Gi hat geschrieben:Man beachte die Ursprünge der Namen von Programmiersprachen:

Python -> Monty Python -> macht Spaß

Java -> Kaffee -> ist ungesund, macht nervös, abhängig und hohen Blutdruck

Ruby -> Edelstein -> ist nicht alles Gold was glänzt ;)
:lol:

BTW Ruby: Was ihr immer alle gegen Ruby habt :roll: :D Wenn einige die Blöcke checken würde und wie eleganten und kurzen Code man damit fabrizieren kann...:P

I will Blöcke in Python!!11elf11!! Und Zwar jetzt. Georg Brandl, bring das mal bitte zur Sprache, da du ja im Core Team bist :)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

poker hat geschrieben:BTW Ruby: Was ihr immer alle gegen Ruby habt :roll: :D Wenn einige die Blöcke checken würde und wie eleganten und kurzen Code man damit fabrizieren kann...:P
Das hat mit Checken oder nicht Checken nix zu tun. In Python sind Funktionen First-Class-Objects und damit kannst du sie einer Funktion übergeben, wie in Ruby einen Codeblock. Ist halt kein sytaktischer Zucker dabei.
Ich hätt mir ja ein anderes with-Statement gewünscht, aber solange Python die momentanen Scoping Regeln hat wird damit nix.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

poker hat geschrieben: I will Blöcke in Python!!11elf11!! Und Zwar jetzt. Georg Brandl, bring das mal bitte zur Sprache, da du ja im Core Team bist :)
It's Open Source! Einen Beitrag auf python-dev oder (vielleicht angebrachter) python-ideas kann jeder schreiben. Nur kann ich dir versichern, dass das Thema bereits besprochen wurde (woraus dann das with-Statement entstanden ist) und mit entsprechendem Desinteresse behandelt werden wird.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

mitsuhiko hat geschrieben:
poker hat geschrieben:BTW Ruby: Was ihr immer alle gegen Ruby habt :roll: :D Wenn einige die Blöcke checken würde und wie eleganten und kurzen Code man damit fabrizieren kann...:P
Das hat mit Checken oder nicht Checken nix zu tun. In Python sind Funktionen First-Class-Objects und damit kannst du sie einer Funktion übergeben, wie in Ruby einen Codeblock. Ist halt kein sytaktischer Zucker dabei.
Nein, ich habe das so gemeint wie ich es geschrieben habe. Meine Aussage nochmal ausführlicher: Was haben immer "alle" (=viele) pythonistas gegen Ruby? Wenn einige von denen Rubys Blöcke verstehen würden und was für eleganten und kurzen code man damit schreiben kann, würde Ruby auf die halb soviel abschränkend wirken

IMO ist, dass viele Pythonistas Ruby nicht nur wegen den vielen einsatz von regexes nicht mögen, sondern weil denen auch der sehr kompakte (Um nicht zu sagene stark komprimiert :D) code unbegreiflich erscheint, der IMO von den vielen Einsatz der Blöcke resultiert. -- Zumindest kommt es mir so vor. Ich habe halt immer diesen eindruck wenn ich mit ein par pythonistas rede die sich mit ruby **nur** oberflächlich beschäftigt haben.

mitsuhiko hat geschrieben: Ich hätt mir ja ein anderes with-Statement gewünscht, aber solange Python die momentanen Scoping Regeln hat wird damit nix.
Naja, ich finde das `with`-stmt schon ok, **aber** es hat IMO nicht viel gemeinsam mit den Blöcken von Ruby ;) Klar, von der Intention her ähnlich, aber die Umsetzung ist halt anders und bei Python nicht so ausdrucksstark wie bei Ruby.

Es ist eben geil in Ruby, IMO (und das siehst du doch auch so?), das man einfach Methoden schreiben kann die Blöcke entgegen nehmen können und dadurch viel Expressivität erlauben. Einfach in Python ein `__enter__` und `__exit__` in na class implementieren, und dann mit ein `with` davor gefolgt von ein `as name` zu schreiben, finde ich nicht sonderlich berauschend im verglich zu Blöcken. --Aber, ich muss sagen das ich pythons `with` auch nie als Ruby-Blöcke äquivalent angesehen habe, auch wenn man deren Herkunft ein wenig spüren kann. Und wenn man das berücksichtigt, finde ist das `with`-stmt auch eine geile Sache :) MAn darf es nur nicht vergleichen wollen ;)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

@poker: Ich finde es interessant, wie du anderen immer vorwirfst, sich nicht mit Ruby zu beschäftigen. Fakt ist, dass Ruby Blöcke in Python nicht funktionieren, weil wir eine Syntax haben, die auf Einrückung basiert. Das with Statement „hätte“ in die Richtung gehen können, ist es aber nicht.

Du darfst gerne Ruby nutzen, niemand hält dich davon ab.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

poker hat geschrieben: IMO ist, dass viele Pythonistas Ruby nicht nur wegen den vielen einsatz von regexes nicht mögen, sondern weil denen auch der sehr kompakte (Um nicht zu sagene stark komprimiert :D) code unbegreiflich erscheint, der IMO von den vielen Einsatz der Blöcke resultiert. -- Zumindest kommt es mir so vor. Ich habe halt immer diesen eindruck wenn ich mit ein par pythonistas rede die sich mit ruby **nur** oberflächlich beschäftigt haben.
Für so dumm würde ich jetzt die Pythonistas nicht halten, dass sie Rubys Blöcke nicht verstehen. Aber auch wenn man weiß, wie sie funktionieren, muss man sie nicht unbedingt in Python einbauen wollen.
Es ist eben geil in Ruby, IMO (und das siehst du doch auch so?), das man einfach Methoden schreiben kann die Blöcke entgegen nehmen können und dadurch viel Expressivität erlauben.
Ich halte first-class-Funktionen hier durchaus für ausreichend, und vor allem, mit Pythons Syntax vereinbar.

Dass Pythons `with` mit Rubys Blöcken nicht verglichen werden kann, sollte jedem hier klar sein (sonst sollte er sich nochmal PEP 343 anschauen ;)).
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

birkenfeld hat geschrieben:Dass Pythons `with` mit Rubys Blöcken nicht verglichen werden kann, sollte jedem hier klar sein (sonst sollte er sich nochmal PEP 343 anschauen ;)).
Man beachte den Konjunktiv ;-) with ist nicht, hätte aber werden können.
TUFKAB – the user formerly known as blackbird
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

@mitsuhiko:
Erstmal vorweg: Wie kommt es eigentlich, Armin, das du *grundsätzlich* erstmal alle meine Posts als negativ auffast? Das liest sich nämlich auch aus deinen jetzigen Post heraus, da du *pampig* reagierst. Gibt es irgendeinen bestimmten Grund? Gerne könne wir das auch per PM klären. Aber das will ich erstmal geklärt haben.

Dennoch auf deinen Post kurz ein par worte:
mitsuhiko hat geschrieben:@poker: Ich finde es interessant, wie du anderen immer vorwirfst, sich nicht mit Ruby zu beschäftigen.
Wo werfe ich hier, oder habe ich jemals vorgeworfen das jemand sich nicht mit Ruby beschäftigt?! Mal ernsthaft, Armin. Bleibt doch jedem selber überlassen ober er sich mit Ruby beschäftigen möchte. Oder kling das hier wie ein Vorwurf? Zeig mir das mal bitte.
mitsuhiko hat geschrieben: Fakt ist, dass Ruby Blöcke in Python nicht funktionieren, weil wir eine Syntax haben, die auf Einrückung basiert. Das with Statement „hätte“ in die Richtung gehen können, ist es aber nicht.
Das mag sein und glaube ich dir mal an der stelle, aber dennoch dürfte doch folgende Frage erlaubt sein oder?

In wiefern verhindert das die Einrückung? Ich sehe da kein Problem.
mitsuhiko hat geschrieben: Du darfst gerne Ruby nutzen, niemand hält dich davon ab.
Das ist wider eine deiner negativ gefärbten Aussagen :/ Wo habe ich das behauptet? Wann habe ich das behauptet? Warum sollte ich sowas behaupten?

Wenn ich dich richtig verstehe, wirfst du mir vor das ich in einem Python Forum ab und an Ruby in den Mund nehme und euch vorwerfe das ihr Ruby nicht nutzt? Oder um was geht es dir? Sry, ich werde aus deinen Posts nicht schlau.

Fakt ist, ich liebe Ruby **und** Python (und Python sogar noch mehr), sonst würde ich ja kaum mit Python Programmieren.

Naja...wie dem auch sei...

birkenfeld hat geschrieben: Dass Pythons `with` mit Rubys Blöcken nicht verglichen werden kann, sollte jedem hier klar sein (sonst sollte er sich nochmal PEP 343 anschauen ;)).
Das ist klar. Du, Reinhold, und Armin habt den Stein angestoßen in euren vorherigen Post, und ich habe darauf geantwortet.
birkenfeld hat geschrieben:
poker hat geschrieben: IMO ist, dass viele Pythonistas Ruby nicht nur wegen den vielen einsatz von regexes nicht mögen, sondern weil denen auch der sehr kompakte (Um nicht zu sagene stark komprimiert :D) code unbegreiflich erscheint, der IMO von den vielen Einsatz der Blöcke resultiert. -- Zumindest kommt es mir so vor. Ich habe halt immer diesen eindruck wenn ich mit ein par pythonistas rede die sich mit ruby **nur** oberflächlich beschäftigt haben.
Für so dumm würde ich jetzt die Pythonistas nicht halten, dass sie Rubys Blöcke nicht verstehen.
Das war auch nicht meine Aussage und habe ich auch nicht gemeint.

birkenfeld hat geschrieben: Ich halte first-class-Funktionen hier durchaus für ausreichend, und vor allem, mit Pythons Syntax vereinbar.
Ja, ist halt ein anderes Konzept und bietet eine andere Herangehensweise. Hat aber mit Ruby-Blöcken genau soviel am Hut wie `with` ;)

first-class-functions haben halt eine andere Expressivität als Ruby-Blöcke. Beide Konzepte erfordern eine andere mentale Herangehensweise, da es total komplett andere Konzepte sind. Beide, wenn richtig angewendet, sind aber in ihrer Ausführung Edel, Elegant, Perfekt, ...

Beide Konzepte in einer Sprache vereint, währe, zumindest für mich, das Höchste :) Kannst mich gerne für durchgeknallt halten...

Ich wüste persönlich auch nicht, warum es nicht gehen sollte beide Konzepte in Python zu haben. -- Das first-class-functions in Ruby (wegen dem Objektsystem.) nicht möglich ist, ist klar. Aber weshalb Blöcke in Python nicht gehen, müsstest du mir erklären. (Ja, Armin sagte schon wegen der Einrückungen, aber was genau verhindert das?)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

poker hat geschrieben:
birkenfeld hat geschrieben: Ich halte first-class-Funktionen hier durchaus für ausreichend, und vor allem, mit Pythons Syntax vereinbar.
Ja, ist halt ein anderes Konzept und bietet eine andere Herangehensweise. Hat aber mit Ruby-Blöcken genau soviel am Hut wie `with`
Nein, es hat damit viel mehr "am Hut". Rubys Blöcke sind schließlich kaum was anderes als anonyme Funktionen...

Ich verstehe nun wirklich nicht, was an

Code: Alles auswählen

3.times { |i| print i }
konzeptuell anders sein soll als an

Code: Alles auswählen

times(3, lambda i: print(i))
eine entsprechende Definition von "times" vorausgesetzt.
poker hat geschrieben:Aber weshalb Blöcke in Python nicht gehen, müsstest du mir erklären. (Ja, Armin sagte schon wegen der Einrückungen, aber was genau verhindert das?)
Schlag doch mal eine Syntax für Blöcke vor, dann sehen wir schon :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

poker hat geschrieben:Du, Reinhold, [...]
Wer ist Reinhold?
poker hat geschrieben:Das first-class-functions in Ruby (wegen dem Objektsystem.) nicht möglich ist, ist klar.
Mag mir das mal jemand erklären?
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Y0Gi hat geschrieben:
poker hat geschrieben:Du, Reinhold, [...]
Wer ist Reinhold?
Ehm, Georg Brandl? :shock:
http://www.google.de/search?aq=t&oq=&hl ... uche&meta=

Ich dachte das wäre bekannt ;) Er ist ja schon ein par tage im Core Team, damals noch unter seinem richtigen Namen.

[OT]Aber sag mal Reinhold, wie bist du auf Georg Brandl gekommen?[/OT]
Y0Gi hat geschrieben:
poker hat geschrieben:Das first-class-functions in Ruby (wegen dem Objektsystem.) nicht möglich ist, ist klar.
Mag mir das mal jemand erklären?
Gerne. Zugegeben, der satz ist ein wenig schwamig von mir, aber wenn ich mal näher ausgeführt habe, kann man das darauf herleiten.

Gib mir mal ein Augenblick. Ich schreibe dazu ein par Beispiele damit man das visuell nachvollziehen kann :)
poker
User
Beiträge: 146
Registriert: Donnerstag 20. September 2007, 21:44

Y0Gi hat geschrieben:
poker hat geschrieben:Das first-class-functions in Ruby (wegen dem Objektsystem.) nicht möglich ist, ist klar.
Mag mir das mal jemand erklären?
hi Yogi.

Als erstes ist wichtig zu wissen, das Ruby total OOP ist. Dann muss man begreifen das man auf Attribute (~Variabeln) nicht zugreifen kann von außen. Solche Zugriffe werden über Methoden forciert ;) Wo wir auch schon die Antwort darauf haben warum bei Ruby die Klammern optional sind.

Aber der Reihe nach:


Folgendes geht nicht

Code: Alles auswählen

class MyClass
  def initialize
    @eggs = [NIL, 1]
  end
end

c = MyClass.new
c.eggs
und wirft folgende exception:
test.rb:8: undefined method `eggs' for #<MyClass:0x29406f4 @eggs=[nil, 1]> (NoMe
thodError)
Nur die Instanz selbst hat zugriff auf seine Instanzvariablen. Außerhalb kann man nur über Methoden darauf zugreifen:

Code: Alles auswählen

class MyClass
  def initialize
    @eggs = [NIL, 1]
  end

  def eggs
    @eggs
  end
  def eggs=(value)
    @eggs = value
  end

end

c = MyClass.new
p c.eggs

c.eggs = 1
p c.eggs

c.eggs=(42)
p c.eggs()
Ergibt:
[nil, 1]
1
42
Hier kann man auch schon sehen wie Ruby Arbeitet. ein `c.eggs` oder `c.eggs()` ruft die Methode lesend auf. Ein `c.eggs = ` oder `eggs=()` währe dann eine Forcierung einer Zuweisung.

Da obere Möglichkeit zu viel Schreibkram ist, nur für Variablen die man nur lesen oder etwas zuweisen möchte, gibt es dafür auch eine Kurzform:

Code: Alles auswählen

class MyClass
  attr_accessor :eggs
  def initialize
    @eggs = [NIL, 1]
  end
end
`attr_accessor ` erzeugt selbständig `eggs()` und `eggs=()`. Darüberhinaus gibt es noch `attr_reader` das nur die `eggs()` erzeugt und ein `attr_writer` das nur `eggs=()` erzeugt.



So, aufgrund dieses OOP-Designs hat man sich dann entschieden klammern optional zu machen. Aber durch diese Entscheidung, ist es nicht möglich Funktionen "direkt" (=über ihren Namen) als Referenzen rumzureichen. Das heißt aber nicht das Ruby nicht Funktionen höherer Ordnung unterstützt ;) IN Ruby muss man halt vorhandenen Funktionen (eigentlich Methoden, den Funktionen gibt es in dem Sinne nicht) in proc-objects umwandeln um sie rum zureichen.

Auch kann man für anonyme Funktionen in ruby Blöcken verwenden (Insofern hat birkenfeld mit seiner Aussage auch irgendwie recht. Er bedenkt aber nicht das Blöcke noch weiter mehr machen können als er in seinem Trivial beispiel zeigt).

folgendes Python Beispiel

Code: Alles auswählen

def foo():
    return 42
def bar(f):
    foo()
bar(foo)
würde in Ruby z.B. so gehen:

Code: Alles auswählen

def foo()
  42
end

def bar(f)
  f.call
end

p bar(self.method(:foo))
Nicht so schön wie first-class-funktionen aber naja, es geht und IMO überwiegen die anderen Vorteile in Ruby und das Klammern optional sind ;)

/e
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

poker hat geschrieben:
Y0Gi hat geschrieben:
poker hat geschrieben:Du, Reinhold, [...]
Wer ist Reinhold?
Ehm, Georg Brandl? :shock:
http://www.google.de/search?aq=t&oq=&hl ... uche&meta=

Ich dachte das wäre bekannt ;) Er ist ja schon ein par tage im Core Team, damals noch unter seinem richtigen Namen.
Huh? Ich dachte, 'birkenfeld' wäre der Nickname gewesen und er hat sich dann entschieden, Python unter seinem echten Namen weiter zu entwickeln... und einige Mailinglist-Archive bestätigen mir das offenbar auch. Nur, dass es einen imaginären Vornamen gab, war mir noch nicht bekannt.


poker: Danke für die Aufklärung.

Der Accessor-Kram ist mir bekannt gewesen.

Jetzt wo du's beschreibst, meine ich mich daran zu erinnern, mal über diesen umständlichen Weg gelesen zu haben, über den man direkt auf die Funktionen und Methoden als Objekte in Ruby zugreifen kann.

Ich persönlich schätze auch leere Klammern beim Funktionsaufruf, weil sie genau diesen kennzeichnen. Nun, das ist wohl der Preis, den man (vielleicht anfangs nichts ahnend) bei Rubys Entwicklung bezahlen musste, um (zugegeben, öfter) ein paar Zeichen weniger tippen zu können.
poker hat geschrieben: folgendes Python Beispiel

Code: Alles auswählen

def foo():
    return 42
def bar(f):
    foo()
bar(foo)
Du meinst hier nicht zufällig folgendes?

Code: Alles auswählen

def foo():
    return 42

def bar(f):
    f()  # <--

bar(foo)
Antworten