Vielen Dank für deine Antwort Sirius
Sirius3 hat geschrieben: Donnerstag 12. August 2021, 19:35
In dem von Dir verlinkten Artikel wird nirgends `self` benutzt, also kannst Du das nicht davon haben.
Ja das stimmt, sorry
Sirius3 hat geschrieben: Donnerstag 12. August 2021, 19:35
Mit `show_properties` benutzt Du eine globale Klassenvariable, die man ebensowenig benutzen sollte, genausowenig wie sonstige globale Variablen. Warum übergibst Du das nicht als Argument an `get´?
OK, danke, das war mir so nicht bewusst. Da der Parameter 'show_properties" nur in der Klasse übergeben wird,
dachte ich, dass er nur dort gilt und nicht global gilt.
Sirius3 hat geschrieben: Donnerstag 12. August 2021, 19:35
Ebenso ist das `self` von `get` falsch, da es sich hier offensichtlich um eine Klassenmethode handelt, die aber nicht so geschrieben wurde.
True vergleicht man nicht mit `is`. `Parameters` ist im Formatstring falsch geschrieben.
Ja das stimmt, das sind Flüchtigkeitsfehler, die einem nicht unterlaufen sollten.
Sirius3 hat geschrieben: Donnerstag 12. August 2021, 19:35
`get` ist eigentlich überflüssig, weil __new__ nur aus dessen Aufruf besteht.
Die for-Schleife ist eigentlich überflüssig, außer man will wirklich diese Ausgabe.
Bleibt also
Code: Alles auswählen
class AvailableLanguages:
def __new__(cls, show_properties=False):
standard_languages = Languages().csv_languages_standards
if show_properties:
for language, parameters in standard_languages.items():
print(
f'{language:>10s} | {parameters["Delimiter"]:<2s}| {parameters["Quote_Character"]:<0s} | {parameters["Quoting"]:<3s}'
)
return list(standard_languages)
Sirius3 hat geschrieben: Donnerstag 12. August 2021, 19:35
`_new__` liefert also die Schlüssel eines Wörterbuchs als Liste zurück. Aber warum sollte man eine Liste bekommen, wenn man eigentlich eine Instanz der Klasse `AvailableLanguages` will?
Das ist verwirrend, und kein Anwendungsfall für __new__ und auch kein Anwendugsfall für eine Klasse. Ebensowenig ist `Languages` eine wirkliche Klasse.
Hmm, man soll mit dem Befehl = csv_vt.AvailableLanguages( ) eine Liste aller verfügbaren Formatierungen erhalten,
die man dann weiter verarbeiten kann. Wenn es anders geht, bin ich für Vorschläge offen.
Hier nochmal alles in Einem, mit Änderungen von Sirius :
Code: Alles auswählen
class Languages:
csv_languages_standards = {
"Standard": {
"delimiter": ",",
"quote_character": '"',
"quoting": "QUOTE_MINIMAL",
},
"Unix": {"delimiter": ",", "quote_character": '"', "quoting": "QUOTE_NONE"},
"XLS": {"delimiter": ",", "quote_character": '"', "quoting": "QUOTE_ALL"},
}
def register(self):
if self.language_parameters["language"] in Languages.csv_languages_standards:
print("The Specified Name For The Language Is Already Registered !")
return self
Languages.csv_languages_standards[self.language_parameters["language"]] = {
"delimiter": self.language_parameters["delimiter"],
"quote_character": self.language_parameters["quote_character"],
"quoting": self.language_parameters["quoting"],
}
print(
"Sucessfully Registered Language : {}".format(
self.language_parameters["language"]
)
)
class RegisterLanguage:
def __new__(self, language, **parameters):
print("Setting Up Parameters ...")
self.language_parameters = {
"language": language,
"delimiter": parameters.get("delimiter", "None"),
"quote_character": parameters.get("quote_character", "None"),
"quoting": parameters.get("quoting", "None"),
}
for x in self.language_parameters:
if self.language_parameters[x] == "None":
print(f"The Parameter For '{x}' Is Missing !")
return self
print("Registering Language : {}".format(self.language_parameters["language"]))
Languages.register(self)
class AvailableLanguages:
def __new__(cls, show_properties=False):
standard_languages = Languages().csv_languages_standards
if show_properties:
for language, parameters in standard_languages.items():
print(
f'{language:>10s} | {parameters["delimiter"]:<2s}| {parameters["quote_character"]:<0s} | {parameters["quoting"]:<3s}'
)
return list(standard_languages)
langs1 = AvailableLanguages() # -> Zeigt alle verfügbaren Formatierungen aus 'csv_languages_standards' an
print(langs1)
RegisterLanguage("Deutsch", delimiter=",", quoting="QUOTE_MINIMAL", quote_character='"') # -> Fügt der Klasse 'Language' eine neue Formatierung hinzu
langs2 = AvailableLanguages(show_properties=True)
print(langs2)
# Remove_Language( language ) # -> Entfernt eine bestimmte Formatierung aus Klasse 'Languages'
Ich hoffe, so ist der Code verständlicher.
Der Sinn & Zweck ist eine Formatierung zu hinterlegen, die man variabel anlegen und löschen
und später in der Anwendung verwenden kann.
Kleine Anmerkung : Ich musste mich bei meinen Tests ja nach irgendetwas richten, ich habe in diesem
Fall das Modul "csv" genommen. Wenn ihr Euch das anschaut, benutzt "Dialect" ähnliche Mechanismen
VG
YAPD