"With" Python vs. VBA

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.
Antworten
Gleitschirmflieger
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2018, 13:44

Sonntag 4. Februar 2018, 14:34

Hallo liebe Forumsgemeinde,

Bin neu hier im Forum und auch Python-Anfänger.
Ich hoffe mit meiner ersten Frage die Alt-Eingesessenen nicht gleich zu verprellen, ... mir fehlen offen gestanden die Schlagworte für die Suchfunktion.

Meine bisherigen Programmier-Erfahrungen beschränken sich auf VBA.
In VBA gibt es das "With" Statement, das wie folgt verwendet wird:

Private Sub Test()
Dim lblTest as msForms.Label
Set lblTest = ActiveSheet.Controls("Label1")
With lblTest
.Caption = "Text"
.Forecolor = RGB(255,255,255)
.Font.Size = 8
End With
End Sub

Nun suche ich nach vergleichbarem in Python.
(Dort gibt es zwar auch ein "With" Statement, welches jedoch eine andere Funktion erfüllt.)

Also statt das betreffende Objekt in jeder Zeile neu zu nennen, wie hier ...

from tkinter import *
canvas = Tk()
canvas.title("Test")
canvas.geometry("400x400")
canvas.mainloop()

... dachte ich es gäbe in Python ein ähnliches Statement:

from tkinter import *
canvas = Tk()
With canvas
.title("Test")
.geometry("400x400")
.Mainloop()
End With

Besten Dank vorab für Verständnis und Hilfe,

Gruß, Frank
Benutzeravatar
/me
User
Beiträge: 3192
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sonntag 4. Februar 2018, 14:45

Gleitschirmflieger hat geschrieben:Nun suche ich nach vergleichbarem in Python.
Kurz gesagt: so etwas gibt es nicht.
__deets__
User
Beiträge: 3077
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 4. Februar 2018, 14:58

Und laenger gesagt: du kannst verschiedene Dinge tun, um das anders zu loesen:

- weise canvas einfach einer kurzen Variablen zu:

Code: Alles auswählen

c = canvas
c.title("Test")
- benutz setattr

Code: Alles auswählen

for name, value in [("title", "Test"), ("geometry", "400x400"), ..]:
    setattr(canvas, name, value)
Sirius3
User
Beiträge: 8089
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 4. Februar 2018, 15:15

@Gleitschirmflieger: das with in VBA hat den Nachteil, dass es nur für ein Objekt funktioniert und dann auch noch die Lesbarkeit einschränkt. Das Wiederholen eines einfachen Namens ist nicht so eine große Einschränkung, wie Du jetzt vielleicht denkst.

Und noch eine Anmerkung: vergiss gleich, dass es *-Importe gibt. Tkinter wird üblicherweise als `import tkinter as tk` eingebunden und alle Namen per tk.xxx angesprochen. Das erhöht auch wieder die Lesbarkeit, weil man immer nachvollziehen kann, woher ein Name kommt.

@__deets__: einbuchstabige Namen sollte man nicht verwenden, weil sie die Lesbarkeit stark einschränken. Und Dein Idee mit der for-Schleife machen die Lesbarkeit vollends ganz kaputt und funktioniert auch nur bei einfachen Zuweisungen.
Gleitschirmflieger
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2018, 13:44

Sonntag 4. Februar 2018, 15:20

Vielen Dank Euch beiden für die schnelle Antwort.
Das hilft mir schonmal weiter.

Gruß und Dank,
Frank
Gleitschirmflieger
User
Beiträge: 3
Registriert: Sonntag 4. Februar 2018, 13:44

Sonntag 4. Februar 2018, 15:37

@Sirius3

Danke für Deine Tipps.
Was Lesbarkeit angeht bin ich absolut Deiner Meinung!
Den tkinter import hab ich so in mehreren Tutorials gesehen ... einfach abgeschrieben und damit offenbar schlechten Stil übernommen.
Auch hier Danke für Deinen Hinweis auf den korrekten Stil.
Das "With" Statement in VBA (in Kombination mit Einrückung per Tab) empfinde ich für die Lesbarkeit eher förderlich.
Nichtsdestotrotz ... VBA war gestern ... auf zu neuen Ufern mit Python 8)

Gruß und Dank,
Frank
__deets__
User
Beiträge: 3077
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 4. Februar 2018, 15:41

Sirius3 hat geschrieben:Name kommt.
@__deets__: einbuchstabige Namen sollte man nicht verwenden, weil sie die Lesbarkeit stark einschränken. Und Dein Idee mit der for-Schleife machen die Lesbarkeit vollends ganz kaputt und funktioniert auch nur bei einfachen Zuweisungen.
Die for-Schleife ist nicht wirklich schoen, die Technik zu kennen lohnt weil man zB solche Informationen aus einer Datenstruktur holt - Config-Datei oder aehnliches. Aber stimmt, wuerde ich eher nicht im Code so schreiben.

Was die Regel angeht: wie ueblich sehen wir das kontextabhaengig anders. Du haelst Regeln gerne immer ein. Ich halte sie fuer gute Ideen, denen man auch mal mit gutem Grund nicht folgen kann. Natuerlich wuerde ich nie a-z als Variablen-Namen (edit: fuer wichtige, langlebige Objekte) in einem Programm verwenden. Aber lokale aliase finde ich durchaus legitim. Wenn's schee macht, mit contextmanager zur Einrueckung (leider leakt der Name... das faende ich anders schoener).

Code: Alles auswählen

from contextlib import contextmanager
@contextmanager
def rename(v):
    yield v
class Foo:
    pass
dickes_ding_mit_langem_namen = Foo()
with rename(dickes_ding_mit_langem_namen) as d:
    d.pillepalle = "egal"
try:
    print(d)
except NameError:
    print("nicht mehr im Kontext")
Antworten