BlackJack hat geschrieben:@Alfons Mittelmeyer: Ja nee, schon klar, `partial()` funktioniert nicht, aber was genau kannst Du nicht sagen.
Ich würde ja eher sagen Du hast oder hattest es nicht verstanden, wie so vieles nicht. Schau einfach mal in den Quellen nach wann `partial()` das letzte mal verändert wurde.
Wäre natürlich auch möglich, dass das nichts mit partial zu tun hatte, sondern mit direktem Binding einer Funktion an einen command. Normalerweise sollen solche bindings im GuiDesigner nicht über direkten Aufruf laufen sondern über die Queue des dort verwendeten Eventbrokers, weil sich ansonsten eine veränderte Aufrufreihenfolge ergibt, Denn da ich in tkinter die Queue nicht polle, gilt da, dass den ersten die Hunde beißen. Wenn der etwas sendet, muß er erst warten, bis alle anderen, die aufgerufen werden und die auch senden, dieses auch getan haben und dann kann er erst weitermachen. Wenn allerdings der command auf der Queue liegt, dann muß dieser warten, was er ja sowieso muß. Und die anderen können dann senden, indem sie die Messages einfach auf die Queue legen, ohne dann warten zu müssen.
BlackJack hat geschrieben:Und wo steht da jetzt in dem wikipedia-Zitat das man Zugriffsschutz braucht? Braucht man nämlich nicht. „Unterbunden“ heisst nicht das man es absolut gar nicht mehr machen kann, sondern das der direkte Zugriff einfach nicht mehr zur offiziellen API gehört. Kapselung funktioniert auch in dem man sich einfach an entsprechende Konventionen hält und dokumentiert was nicht öffentlich oder nur lesbar sein soll.
Sicher braucht man den, denn wieso bemühen sich dann andere Programmiersprachen um Attribute und Methoden als private zu erklären? Kapselung funktioniert dann gut, wenn jemand, der eine Ahnung hat, etwas so schreibt, dass es den Konventionen von Kapselung entspricht und denjenigen etwas auf den Deckel gibt, die sich nicht daran halten, Wenn aber jemand, der nicht viel Ahnung hat, die Attribute und Methoden schreibt, denkt er dabei kaum an Kapselung.
BlackJack hat geschrieben:Deine Programme funktionieren nicht gut, sondern eher erstaunlicherweise und nur soweit Du damit kommst, was eher selten ein tatsächlich sinnvolles Stück Software ist, sondern meistens reine Selbstbefriedigung Deines Spieltriebs, ohne Sinn und Verstand, um zu schauen wie abwegig und umständlich man eigentlich bereits gelöste Probleme anders lösen kann als alle anderen und wie weit man sich dabei von Python und allgemeinen „best practices“ entfernen kann.
Zeig mir mal einen GuiBuilder, der an das Grid Layout meines GuiDesigners herankommt, oder der alle Layouts, wie pack, place und grid verwirklicht hat. Zeig mir einen, der so ziemlich jede GUI aus einem x-beliebigen Python Programm bearbeiten kann. Es fehlt allerdings noch die Übernahme von tkinter Widgets nach DynTkInter, wenn nicht alle Module DynTkInter verwenden und auch die Details der Treeview habe ich noch nicht implementiert.
BlackJack hat geschrieben:Die Zeilen 6-8 sind kein Quatsch, weil man auf diese Weise eben einfach an die Bestandteile heran kommt aus denen das neue Funktionsobjekt besteht.
Diese Zeilen sind Quatsch, denn func, *args, **keywords sind bereits als Parameter da. Und seltsamerweise greift Zeile 3 auf diesen parameter keyswords zu anstatt auf das völlig überflüssige "newfunc.keywords = keywords". Es ist also wesentlich einfacher, gleich auf die Parameter zuzugreifen anstatt die nochmals in Variablen zu speichern.
BlackJack hat geschrieben:Und selbst nicht wissen was der Punktoperator macht, aber im nächsten Satz den Python-Entwicklern unterstellen das sie nicht viel Ahnung von Python haben ist wieder so ein Klassiker der es echt schwer macht irgendwas von Deinen Aussagen tatsächlich ernst zu nehmen. Das ist schon fast surreal.
Ja toll das mit dem Punktoperator. Geht aber:
Code: Alles auswählen
def my_function(name,vorname,x):
print(name,vorname,x)
return 'murks'
def partial(function,*args,**kwargs):
def execute(*new_args,**new_kwargs):
dict_kwargs = dict(kwargs)
dict_kwargs.update(new_kwargs)
return function(*(args + new_args),**dict_kwargs)
return execute
my_function.x = 5
print(my_function.x)
a = partial(my_function,'Mittelmeyer','Alfons')
print(a('test'))
my_function.x ist aber jetzt keine globale Variable oder, weil nämlich my_function eine Funktion ist, oder wie ist es jetzt damit?
BlackJack hat geschrieben:Also letztendlich hast Du `partial()` natürlich nicht nachprogrammiert, denn *das* ist wenigstens sinnvoll implementiert.
Ja wenn Du meinst dass völlig überflüssige Zeilen und noch mit so einem komischen Punktoperator auf eine Funktion eine sinnvolle Programmierung sind, dann kannst Du mir nur leid tun.
Ach so, noch eine Frage: bei python doc nehmen sie in Zeile 7 copy. Ich habe aber dict genommen. Was ist nun besser? copy könnte schneller sein, oder was meint Ihr?