Übernahme von Variablen zur Verwendung in importierte Module

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
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

Hallo,

wie kann ich Werte, die ich in Funktionen anderer Module nutzen will, explizit im Aufruf übergeben?

Eine Variable die ich zu Beginn über ein Formular abfrage

Syntax lautet:

Code: Alles auswählen

InputPath = arcpy.GetParameterAsText(1)
möchte ich in Funktionen verwenden, die ich in importierte Module aufgeteilt habe.

Was muss ich tun, damit die Fehlermeldung:

Code: Alles auswählen

InputPath = arcpy.GetParameterAsText(1)
verschwindet?

Schonmal vielen Dank!
Zuletzt geändert von pythonscript am Dienstag 5. Juli 2011, 19:14, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum!

Ich sehe da keine Fehlermeldung.

Wenn du Werte in Funktionen anderer Module nutzen willst, musst du sie ihnen explizit im Aufruf übergeben.

Selbst wenn es andere Loesungen gaebe, wuerdest du damit die Aufteilung in Module sinnlos machen, weil dann alle Module implizit an das sie importierende koppeln wuerdest.
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

super, wie war ds noch mit dem Vorfuehreffekt?

Hat sich beim copy und pasten wohl ein Fehler eingeschlichen.

Die Fehlermeldung die ich meinte lautet:

Code: Alles auswählen

NameError: name 'InputPath' is not defined
Zuletzt geändert von pythonscript am Dienstag 5. Juli 2011, 19:15, insgesamt 1-mal geändert.
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

Und welche Möglichkeiten bieten sich mir?
Wie kann ich Werte, die ich in Funktionen anderer Module nutzen will, explizit im Aufruf übergeben?
Zuletzt geändert von pythonscript am Dienstag 5. Juli 2011, 19:17, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

modul.py:

Code: Alles auswählen

def foo(path):
    do_foo(path)
main.py:

Code: Alles auswählen

import modul
input_path = get_input_path()
modul.foo(input_path)
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

Danke erstmal!

In Anlehnung an Dein Beispiel habe ich nun mal folgendes Module gebastelt

---------------------

Code: Alles auswählen

# Main.py

import arcpy
InputName = "c:/inputdir/"
OutputName = "c:/outputdir/"

import Modul
Modul.Variablen(InputName, OutputName)
---------------------

Code: Alles auswählen

# Modul.py

import arcpy
import os

def Variablen(InputName, OutputName):
    arcpy.AddMessage("Input Directory is: " + InputName)
    arcpy.AddMessage("Output Directory is: " + OutputName)
----------------------

Dieses befriedigt meine gewuenschte Anforderung bis auf einen Punkt.

Ich wuerde gern in einem Rutsch alle Variablen uebergeben ohne dass ich wieder Aenderungen bei der Uebergabe machen muss, (z.B. wenn eine neue Variable hinzu kommt oder weil es schlicht weg ziemlich viele sind).

Habe es mal mit
Modul.Variablen(*)

ausprobiert, aber es hat nicht funktioniert.

Gibts diese Moeglichkeit auch?
Zuletzt geändert von pythonscript am Dienstag 5. Juli 2011, 19:15, insgesamt 3-mal geändert.
BlackJack

@pythonscript: Wenn Du auf ``def`` nur mal in Recherchen gestossen bist, solltest Du vielleicht erst einmal ein Python-Tutorial durcharbeiten, bevor Du weiter machst. Funktionen definieren und aufrufen zählt noch zu den absoluten Grundlagen.

Das Tutorial in der Python-Dokumentation ist ein guter Einstieg.
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

Danke!
Da hat sich wohl meine Aenderung mit Deiner Anmerkung ueberschnitten, zumal ich mich zwischenzeitlich auch auf der Suche gemacht habe. Wie gesagt, das Ergebnis ist auch ganz passabel. Aber zu der Variante alles in einem Rutsch zu uebergeben ohne diese einzeln auffuehren zu muessen habe ich noch nichts entdeckt.

(Sorry, bin aber ein Anfaenger und "learne gerade beim doing")
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Du solltest wirkilch dringend das Standardtutorial durcharbeiten. Mit raten und probieren wirst du nicht weit kommen. Außerdem hört es sich nach keinem guten Design an, wenn du viel an ein anderes Modul übergeben möchtest. Wenn das notwendig wird, dann ist es ein hinweis darauf, dass du nur ein Modul brauchst oder aber mit global Variablen arbeitest und nicht mit Funktionen.
Das Leben ist wie ein Tennisball.
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

Danke fuer den Hinweis, aber mein Script wird am Ende in der Tat etwas umfangreicher sein, als der obige Test.

Zur Modularisierung habe ich mich nach durcharbeiten der einschlaegigen Python-Fachliteratur entschieden, wo ich Vor- und Nachteile von Kapselung und Anlegen von Biblitotheken nachgelesen habe. Zwecks Aufteilung in verschiedene Programmteile und bessere Kombinationsmoeglichkeiten habe ich das als sinnvoll erachtet. Mag sein, dass man das von mir gewaehlte Design auch anders bewerten kann.

Die lokalen Variablen verwende ich auch nicht zufaellig, dies haengt unter anderem auch damit zusammen, weil das Script in eine andere Umgebung eingebettet wird (ArcGIS) und in der dortigen Anwendung zu viele globale Variablen zu Problemen fuehren kann (Laut Anwendungsentwickler). Die Anzahl der Variablen kann ich leider auch nicht reduzieren, da es verschiedene Einflussgroessen sind, die in dem Entscheidungsunterstuetzungssystem explizit gewuenscht sind.


Da Probleme leider nicht immer 1zu1 aus der Literatur oder Tutorials uebernommen werden koennen, habe ich gedacht mich nun mal an ein Forum zu wenden.

So, nun habe ich mich lange genug gerechtfertigt fuer meine Frage (ich verspreche in zukunft immer gleich das von vornherein zu tun).

Aber wenn das Forum hier eh nur fuer Vollprofis gedacht ist, die jeden Code ohne Hilfestellung und vor allem ohne auszuprobieren bewerkstelligen, dann kann mir doch bestimmt jemand sagen wo es zum Anfaenger-Forum geht.

Und falls aber doch jemand eine Antwort auf meine Frage hat bin ich dem gern dankbar.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

pythonscript hat geschrieben:Zur Modularisierung habe ich mich nach durcharbeiten der einschlaegigen Python-Fachliteratur entschieden, wo ich Vor- und Nachteile von Kapselung und Anlegen von Biblitotheken nachgelesen habe. Zwecks Aufteilung in verschiedene Programmteile und bessere Kombinationsmoeglichkeiten habe ich das als sinnvoll erachtet. Mag sein, dass man das von mir gewaehlte Design auch anders bewerten kann.
Das ist aber nur dann gewährleistet, wenn tatsächlich alle Werte Klassen/Methoden/Funktionen nur durch ihre entsprechenden Argumente übergeben werden. Wenn man aus jedem Modul Werte eines anderen benötigt und es schlicht keinen Grund gibt Das Modul aufzuteilen, sollte man das auch nicht tun.
pythonscript hat geschrieben:Aber wenn das Forum hier eh nur fuer Vollprofis gedacht ist, die jeden Code ohne Hilfestellung und vor allem ohne auszuprobieren bewerkstelligen, dann kann mir doch bestimmt jemand sagen wo es zum Anfaenger-Forum geht.
Das Forum ist nicht dafür da, deine Arbeit zu erledigen, Hinweise wurden dir ja genug gegeben, wenn du die nicht verstehst, hapert es an den Grundlagen, die musst du dir aber selbst erarbeiten.

Wenn du die Werte immer wieder benötigst, solltest du dir überlegen, Klassen zu nutzen und dort eben deine Pfade/whatever zu übergeben.

Es gibt noch andere Möglichkeiten, aber das läuft dann doch sehr stark in Richtung Flickschusterei und wenn du das Design beeinflussen kannst, solltest du es richtig machen.
deets

Das Forum ist nicht nur fuer Vollprofis gedacht - aber die Vollprofis, die dir hier Tipps geben sollen brauchen schon ein bisschen mehr Kontext. Den hast du nach laengerer Zeit geliefert, aber es haette halt viel Konfusion verhindert, wenn der gleich dagewesen waere.

Ausserdem solltest du zum setzen von Python-Code die dazugehoerigen Forum-Tags verwenden, sonst geht die in Python ja sehr wichtige Einrueckung floeten.
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

Ich bin halt gewohnt mich in Fragen an Mailinglisten und Foren immer moeglichst kurz und praezise zu fassen um diese nicht mit unnoetigem zu ueberfrachten. Aber ich kann zukuenftig den ganzen Kontext immer gern vorweg schicken, wenn es denn hilfreich ist (war es denn hilfreich?).
Fuer mich war dieser Forumbeitrag jedenfalls eine klar definierte Frage, in der es darum ging Moeglichkeiten zu diskutieren die Values zwischen verschiedenen Modulen zu uebergeben. Eine Antwort habe ich erhalten, ich glaube meine von mir daraufhin erarbeitete Loesung ist auch passabel und man sieht, dass ich nicht nur irgendwelche Loesungen einforderde und uebernehme sondern mit Hinweisen konstruktiv arbeite. Ich hatte nur eine kleine Rueckfrage wie man das optimieren kann. Deswegen ein Fass aufzumachen und mir hier vorzuwerfen ich wuerde hier ein Raetsel raten veranstalten und meine Arbeit erledigen lassen anstatt mich nicht mit den Basics beschaeftigen fand ich halt etwas ueberheblich.

Um noch einmal abschliessend zu unterstreichen, dass ich auch gern gewillt bin meine Arbeit zu erledigen und nicht hier bin um meine erledigen zu lassen, fasse ich hier die Hinweise nochmal zusammen (wie es in jedem guten Forum ueblich ist), fuer den Fall, dass jemand anderes mal ein aehnliches Problem haben sollte.

Problem:
Übernahme von Variablen zur Verwendung in importierte Module

Zielfuehrende Loesungsvorschlaege :
- Variablen uebergeben beim importieren mittels "def" (siehe Loesungsbeispiel oben)
- siehe Tutorial der Python-Dokumentation
- raten und probieren vermeiden
- Klassen nutzen

Also dann nochmal Danke fuer die konstruktiven Einwuerfe.
Das mit den Forum-Tags fuer den Python-Code habe ich soeben nachgeholt und werde es zukuenftig immer beherzigen Deets, Danke fuer den Hinweis. :wink:

Kann dann zu hier!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Sich kurz zu halten ist an sich der richtige Weg, oft sind nur ein bis zwei allgemeine Sätze über den Kontex sehr hilfreich. Damit kann man als Helfender deutlich besser abschätzen welche Möglichkeiten in Frage kommen und welche nicht. Bei deinen Postings gab es auch nichts auszusetzen. Vergessen eine Fehlermedlung zu kopieren kann jedem passieren.

Wenn du dir dieses Forum hier vorstellst, als könntest du eine konkrete Frage stellen und bekommst deine eine konkrete Antwort, dann musst du dich umstellen ;-) Hier wird sehr gerne über mögliche Lösungen diskutiert und auch die Fragestellung hinterfragt. Oft ist nicht das beschriebene Problem die Schwierigkeit sondern etwas übergeordnetes (xy-Problem). Daher auch die ganzen Anmerkungen, ob du das wirklich so umsetzen willst. Da du offensichtlich vollen Zugriff auf die Module hast, sieht dein Ansatz einfach falsch aus und scheint es mir auch noch immer zu sein.

Da du "def" für einen entscheidenden Teil der Lösung hältst, solltest du dir auch vorwefen lassen, dass du mit den Grundlagen nicht richtig vertraut bist. Funktionen werden im Grundlagentutorial in Abschnitt vier behandelt und sind absolute Basics. Du kannst vielleicht irgendwie Code zusammenstöpseln, so das er halbwegs das macht was du willst, das ist aber noch kein programmieren.

Das du die Lösung noch einmal zusammenfasst finde ich sehr gut, das kommt hier teilweise zu kurz (was manchmal auch am detaillierten Lösungsweg legen mag).

Bis dann,
Sebastian
Das Leben ist wie ein Tennisball.
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

Na gut, dann wiedereröffne ich doch gern den Threat, da er ein so reges Diskussionsbeduerfnis zu den denkbaren Lösungen weckt und anscheinend auch eine tiefergehende Komponente beinhaltet. Ich habe den Diskussionsbedarf hier, zu dem Themas, wohl etwas unterschätzt und möchte ihn daher nicht voreilig unterbrechen :wink:

Aber eins würde ich gern vornweg klären, da hier doch wohl ein Missverständnis vorliegt.
Das "Def" DIE Lösungsmoeglichkeit ist möchte ich deutlich relativieren, habe es auch nicht so dargestellt. Sie scheint zwar für meinen individuellen Zweck sinnvoll, ich möchte aber nicht abstreiten, dass es Fälle gibt, bei denen andere Lösungen durchaus zielführender sind. Die Liste die ich zuvor zusammengetragen habe, ist daher auch nur als eine vorläufige zu verstehen. Die dortigen vier Möglichkeiten können für solche oder ähnliche Probleme potenzielle Lösungswege aufzeigen, ist Liste selbst ist aber zweifelsohne erweiterbar. Sie fasst lediglich die in diesem Threat geposteten Hinweise zusammen (meines Wissens auch unkommentiert und wertneutral).

Aber über Alternativen, Vor und Nachteile anderer Varianten (es wurden ja schon Klassen angesprochen oder globale Variablen) und weitere konstruktive Diskussionsbeiträge können wir alle sehr gespannt sein....
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@pythonscript: Das Schlüsselwort `def` leitet eine Funktionssignatur ein. Eine Funktion ist keine Variable. Zwar ist eine Funktion allgemein gesprochen ein Name, der wie jeder andere auch in andere Module importiert werden kann und auch ein beliebiges Objekt binden kann, aber ich habe irgendwie das Gefühl, du hälst `def` für eine Art `#define` in C, wenn du "Variable" sagst, und das ist schlichtweg falsch. ;)

EDIT: Ansonsten schließe ich mich meinen Vorrednern an. Programmieren auf gänzliche neuem Terrain hat zwar anfangs häufig was mit Ausprobieren zu tun, aber deine hier präsentierten wild geratenen Versuche zeugen vielleicht von einer ernstgemeinten Herangehensweise, stellen aber sicher kein ernstzunehmendes Grundverständnis hinsichtlich des Themas "Programmierung" dar. Wenn du halbwegs wissenschaftlich an die Sache herangehen willst (deiner Ausdruckweise nach vermute ich mal einen akademischen Hintergrund ;P ), dann arbeite doch ab und zu mal mit Querverweisen (sprich: Links), wo klar wird, dass du dich wirklich mit der von dir benannten Literatur beschäftigt hast und man zudem einschätzen könnte, woraus du genau deine Schlüsse gezogen hast.
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

Vielen Dank für den Hinweis. Vielleicht hab ich mich auch missverständlich ausgedrückt; habe aber gerade auch nicht mehr gefunden, wo ich Def als eine Variable bezeichnet habe, sonst hätte ich das gern korrigiert. Ich kann mich eigentlich auch nur daran erinnern davon gesprochen zu haben, dass bei Def die Variablen MIT übergeben werden oder habe ich das falsch verstanden (der Hinweis kam ja letztlich von cofi), dann korrigiert mich bitte.

Was meine Qüllen anbelangt, so orientiere ich mich derzeit im wesentlichen an Kaiser & Ernesti 2008: Python – Das umfassende Handbuch, Summerfield 2008, Programming in Python 3 (ich weiss, das ist eine andere Version, aber trotzdem), sowie Lutz & Ascher 2007, Einführung in Python nebst der mitgelieferte Python v2.6.5 documentation und diversen Internetqüllen, wie python.org

Die Bücher sind zwar nicht die allerneusten, aber sie scheinen mir seriöse Quellen. Wenn das nicht der Fall ist, dann korrigiert mich bitte ebenfalls.

Vielleicht fasse ich den Begriff Funktion lediglich etwas anders, da es bei mir auch darum geht Funktionen anderer Software zuzugreifen (Nähere Infos hierzu unter: Writing Geoprocessing Scripts With ArcGIS). Aber ich denke das Prinzip ist das gleiche, respektive in Anlehnung an den Funktionsbegriff.

die

Code: Alles auswählen

arcpy.AddMessage
-Zeilen waren jetzt nur Platzhalter und mein Test ob die Variablen suaber übergeben werden, da würde dann letztlich der ausführende Code rein kommen versteht sich


Aber um jetzt einfach auch mal bei der Sache zu bleiben (ich habe das Gefuehl sie geraet immer wieder aus dem eigentlichen focus) vielleicht noch kurz zu den von mir "wild geratenen Versuch", als den er ja bezeichnet wird. Eigentlich habe ich ja den einen (also singulären) Versuch hier zur Diskussion gestellt:
http://www.python-forum.de/viewtopic.ph ... 51#p202751
Danach kamen aber in erster Linie allgemeine Kritik, die meine grundsätzliche Kompetenz in Frage gestellt hat (ich habe dann ja eingestanden, dass ich kein Vollprofi bin), die Kritik hat sich nun aber nur bedingt auf meinen Code bezogen.
Ist der Versuch denn jetzt so wirr oder "unsauber"´programmiert? Ich hätte jetzt gedacht das sei von der Realisierung jetzt eigentlich so in Ordnung oder doch nicht?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Die Kritik hat sich eher weniger an deiner Person abgearbeitet, sondern das ist eher generell eine Schlechte Idee™.

Wenn es um solche "Debugging" Funktionen geht, kann man sich mittels `globals()` und `locals()` Dictionaries aller Namen erstellen lassen.
Dass das nicht gleich kam, hat schlicht und einfach damit zu tun, dass hier regelmässig Anfänger aufschlagen, die Ganz Schleunigst™ mit ihrem Problem fertig werden müssen (und 2 Monate danach am besten nochmal mit demselben Problem antanzen) und trotz aller Warnungen problematische Sachen als "passt perfekt" übernehmen.

Wenn es aber nicht um Debugging geht, das per se tief in den Interna graben muss, sollte man das aber lassen, wenn man keine gute Begründung hat. Eine weitere Idee, die aber auch eher suboptimal ist, ist, dass man sich ein Dictionary mit einer "Umgebung" zusammenstellt und die den Funktionen übergibt, schlägt in diesselbe Kerbe wie `globals()` und `locals()` - und prinzipiell auch wie der frühere Vorschlag der Klasse - von oben, aber ist etwas selektiver.

Zu den Büchern: Das Galileo-Buch hat hier einen eher schlechten Ruf, werf mal die Forensuche nach "Galileo" und "Openbook" an.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

OT: *ugh* ESRI ... wer bei denen die Python-Schnittstelle verbrochen hat, gehört mit mindestens 10 Jahren Java bestraft ;) :D
pythonscript
User
Beiträge: 10
Registriert: Samstag 2. Juli 2011, 19:12

@frabron: Und ich werde die Vermutung nicht los, dass sich der Post hier auch deswegen bisweilen ein bischen im Kreis dreht; obwohl man eigentlich kaum eine andere Chance hat als die ESRI-Macken irgendwie zu umschiffen und auszubueglen.
Ich versuche auch schon seit einer geschlagenen Woche Matplotlib in ArcGIS zum laufen zu bringen; auch das fordert wieder jede Menge Improvisationskuenste, aber das ist ein anderes Thema....
Antworten