Umstieg von Java zu 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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 29. November 2008, 11:53

deamon hat geschrieben:Ein DI-Framework wie Spring nimmt einem die Auflösung der (auch zyklischen) Abhängigkeiten ab und kann teilweise automatisch Objekte konfigurieren.
Mein Code-Beispiel mit Ref/bind löst zyklische Abhängigkeiten auf. Automatische Konfiguration hatte ich bei uns für Java überhaupt nicht bewährt, weil man nichts mehr verstanden hat und daher finde ich das ist kein hilfreiches Feature.

Dafür bräuchtest du in Python irgendwelche Typannotationen. Könnte man machen, wäre aber eine freiwillge Angabe, z.B. so:

Code: Alles auswählen

class Foo:
    __types__ = {'foo': Foo, 'bar': str, 'baz': [int]}

def bind(dct):
    for o in dct.values():
    if hasattr(o, '__types__'):
        for n, t in o.__types__:
            setattr(o, n, find(lambda o: isinstance(o, t), dct.values()))
   ...

def find(f, lst):
    for o in lst:
        if f(o): return o
deamon hat geschrieben:Meine These ist, dass Abhängigkeiten eher in Kauf genommen werden, weil man ja (fast) immer den Quelltext vorliegen hat und dort bei Bedarf direkt ändern kann.
Man braucht es nicht. Nichts ist aufwendig kompiliert und jede Datei lässt sich gleich einfach ändern. In Java wählt man den XML-Weg ja nur, weil der Java-Code eben nicht einfach anpassbar ist und nicht so ausdrucksstark ist, wie das XML-Fragment. Mit fehlender Eleganz hat das nichts zu tun, eher im Gegenteil.

In Python könnte ich mir auch einfach dies ausdenken:

Code: Alles auswählen

beans = {}

def Bean(name, **kwargs):
    if name in beans:
        bean = beans[name]
    else:
        bean = beans[name] = locals()[name]()
        bean.__bean = name
    for k, v in kwargs.items():
        setattr(bean, k, Ref(v.__bean) if hasattr(v, '__bean') else v)

Bean('MovieLister', finder=Bean('MovieFinder'))
Bean('MovieFinder', filename="movies.txt")

bind(beans)
Kannst du das in Java ebenfalls in < 20 Zeilen implementieren?

Stefan[/code][/code]
kasaliko
User
Beiträge: 1
Registriert: Mittwoch 18. Februar 2009, 21:29

Mittwoch 18. Februar 2009, 22:23

Hallo!

Ich schreibe gerade eine Hausarbeit zu "Python und Dependency Injection". Ich soll einen DI-Container von Java auf Python übertragen. Da beide Themen in diesem Thread behandelt wurden, hoffe ich, dass mir hier jemand ein paar Tipps geben kann.

Ehrlich gesagt, habe ich keine Ahnung von Python und das umdenken von Java fällt mir schwer. Allerdings habe ich mich ziemlich schnell gefragt, ob ein DI-Container in Python überhaupt sinnvoll ist. Und ob es überhaupt so einfach von Java auf Python zu übertragen ist.

Mein Plan ist jetzt erstmal, so gut es geht (bzw. ich es kann) den DI-Container nachzubauen. Jedoch will ich in der Ausarbeitung näher auf die Besonderheiten von Python eingehen und evtl. auch etwas dazu schreiben, warum Dependeny Injection in Python keine so große Rolle spielt.

Gibt es vllt irgendwelche Bücher oder Artikel, die sich mit diesem Thema auseinandersetzen? Über Google usw. habe ich nichts gescheites gefunden. Allerdings kenne ich mich auch noch nicht so gut in der Pythonwelt aus und weiß nicht wo ich gezielt suchen könnte.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 18. Februar 2009, 22:44

kasaliko, du hast meine Meinung und ein paar Ad-hoc-Beispiele für DI in diesem Thread gesehen. Hatte ich nicht auch auf Jim Weinrichs Artikel verwiesen? Und das Video von der RubyConf 2008, wo sich Jamis Buck wortreich dafür entschuldigt, 2x ein DI-Rahmenwerk für Ruby schreiben zu wollen? Die sind zwar für Ruby, gelten aber genauso für Python.

Wie bei vielen anderen Entwurfsmustern gilt: Es kommt auf die Programmiersprache an. Für reine DI gibt es in Scriptsprachen wenig Gründe. Will man zusätzlich noch einen Container-Lifecycle wie z.B. bei PicoContainer implementieren, sieht es ein bisschen anders aus.

Mit "keine Ahnung von Python" hast du aber schlechte Voraussetzungen für die Hausarbeit. Und ohne Umdenken wirst du bestenfalls Java mit Python-Syntax schreiben. Aber das kann ja noch werden :)

Weitere Artikel kenne ich keine, aber Google ist dein Freund...

Stefan
Antworten