Einzelproblem: String als Attribut

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
Benutzeravatar
Strawk
User
Beiträge: 229
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Hallo!
Heute melde ich mich mit einem Einzelproblem:

Code: Alles auswählen

def dist(coordinate_1, coordinate_2, method="karney"):
    return distance.method(coordinate_1, coordinate_2).m
Es gibt außerdem die Methoden vincenty und great_circle, aber das Probem ist: Wie kann ich das Attribut angeben, wenn das Funktionsargument ein String ist? Geht das mit getattr()? Wenn ja, wie?

Grüße
Strawk
Ich programmiere erfolglos, also bin ich nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Strawk: Ja das geht mit `getattr()`. Die Funktion ist dokumentiert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Strawk
User
Beiträge: 229
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Hallo __blackjack__!
Mit

Code: Alles auswählen

def dist(coordinate_1, coordinate_2, method="karney"):
    """
    executes chosen distance method for calculating single distances and the total distance
    """
    print(getattr(distance, method))
    # return distance.method(coordinate_1, coordinate_2).m
erhalte ich: AttributeError: module 'geopy.distance' has no attribute 'karney'

:(
Strawk
Ich programmiere erfolglos, also bin ich nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Strawk: Tja, was soll man dazu jetzt sagen? Ganz offensichtlich gibt es in `geopy.distance` keine Funktion die `karney` heisst. Warum glaubst Du das es das dort geben müsste?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Strawk
User
Beiträge: 229
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Hallo __blackjack__!

Sie heißen distance, vincenty und great_circle?

Grüße
Strawk

P.S.: Das Problem ist die Syntax:

Code: Alles auswählen

md = getattr(distance, method)
    return distance.md(coordinate_1, coordinate_2).m
funktioniert nicht.

Code: Alles auswählen

return distance.getattr(distance, method)(coordinate_1, coordinate_2).m
syntaktischer Schwachsinn.
Ich programmiere erfolglos, also bin ich nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Strawk: Wenn die Funktionen `distance()`, `vincenty()`, und `great_circle()` heissen, warum denkst Du dann das Du ein Attribut mit dem Namen 'karney' von dem Modul abfragen kannst? Welcher der drei Funktionen hätte das denn auf magische Weise zugeordnet werden sollen?

Das erste Beispiel funktioniert. Man muss halt ein Attribut angeben das es gibt, und nicht irgendeines was es nicht gibt und irgendwie hoffen da wird schon das richtige bei rum kommen. Der Zwischenschritt über `md` ist nicht nötig. Der Name `md` wäre auch nicht gut. Was soll der bedeuten?

Und das zweite Beispiel ist syntaktisch in Ordnung, aber das `geopy.distance`-Modul hat natürlich keine Funktion definiert die `getattr()` heisst, also gibt es deswegen einen `AttributeError`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Strawk
User
Beiträge: 229
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Hallo _blackjack_!

Ich meine, 2 h Kopfzerbrechen sind jetzt mal genug und bitte um den Code.

Grüße
Strawk
Ich programmiere erfolglos, also bin ich nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Strawk: Den Code gibt es schon, den hast Du schon selbst geschrieben. Nicht nur drüber nachdenken, sondern vielleicht auch mal live ausprobieren. Das `geopy.distance`-Modul hat einfach kein Attribut mit dem Namen `karney`:

Code: Alles auswählen

In [20]: import geopy.distance

In [21]: geopy.distance.karney
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-21-54bc19cf5b41> in <module>()
----> 1 geopy.distance.karney

AttributeError: module 'geopy.distance' has no attribute 'karney'
Da kann man Dir jetzt auch keinen Code zeigen wie man auf dieses Attribut zugreift, wenn es das nicht gibt. Du willst aber vielleicht auch gar nicht auf dieses Attribut zugreifen, sondern auf ein anderes, bzw. eines von drei anderen.

Letztlich würde ich aber vielleicht auch gar keine Zeichenkette übergeben, sondern dem Benutzer direkt die Möglichkeit geben als `method` eine Funktion zu übergeben. Und das Argument dann vielleicht auch `distance_func` oder so zu nennen, weil `method` zu leicht mit „Methode“ im objektorientierten Sinn verwechselt werden kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten