Seite 1 von 1
Funktionen importieren
Verfasst: Freitag 11. Dezember 2009, 22:19
von Midna
Hallo ich meld mich mal wieder mit einem Problem
Also wir haben mal gelernt, dass man Funktionen importieren kann, indem man das Modul angibts und dann die FUnktionen, die man haben will also z.B.:
from random import random
oder so. Ich wollte fragen, ob es auch geht, dass man alle alle Funktionen eines Moduls importieren kann ohne die alle aufzuschreiben?
LG Lisa
Verfasst: Freitag 11. Dezember 2009, 22:27
von Defnull
Ja, aber es wird nicht empfohlen, da man nie weiß, was man da alles importiert.
Verfasst: Freitag 11. Dezember 2009, 22:35
von lunar
Lies die
Dokumentation oder das
Tutorial. Beachte dabei insbesondere diese Passage:
Although certain modules are designed to export only names that follow certain patterns when you use import *, it is still considered bad practise in production code.
Verfasst: Freitag 11. Dezember 2009, 22:57
von cofi
Weil das noch nicht explizit gefallen ist:
Das ist, was man meist haben will.
Verfasst: Samstag 12. Dezember 2009, 15:35
von Midna
Dankeschön ich habe sie nun importiert.
Nun kommt allerdings das nächste Problem. Ich bin echt zu doof für alles
Wenn ich Funktionen importiere (also ich habe eine Datei mit Funktionen selbstgeschrieben und sie nun alle importiert), dann führt der die erste Funktion direkt aus. Also in der Funktion steht etwas mit Frog geschrieben (sowas ähnliches wie Turtle) und das macht der direkt und wenn ich es dann ausführen will, dann steht da immer dass eine globale Variable nicht vorhanden ist, obwohl sie im Hauptprogramm steht. Muss die dann noch woanders stehen?
Verfasst: Samstag 12. Dezember 2009, 15:52
von cofi
Lass mich raten: Du hast Defnulls Hinweis ueberlesen und per * importiert?
Ansonsten solltest du uns mal mit Code fuettern.
Verfasst: Samstag 12. Dezember 2009, 16:15
von jbs
Hast du Code auf Modulebene, also nicht in Funktionen, der ausgeführt wird?
Verfasst: Samstag 12. Dezember 2009, 16:22
von Midna
Hab das hier genommen
import module
Wenn man aber nur ein Modul importiert, kommt das gleiche.
import staedte, pykemon
from intro import intro
spielwelt = Pool(height = 768, width = 1024, bgimage = "gamegirl.gif")
spielwelt.froschliste = []
intro()
spielwelt.kirschblüt = Frog(spielwelt, visible = False)
def kaytown():
def markt(event):
for frosch in spielwelt.froschliste:
frosch.exit()
spielwelt.froschliste = []
spielwelt.bgimage = "marktbild.gif"
[...]
for frosch in spielwelt.froschliste:
frosch.exit()
spielwelt.froschliste = []
spielwelt.bgimage = "kaytown.gif"
spielwelt.eigeneshaus = Frog(spielwelt, visible = False)
spielwelt.froschliste.append(spielwelt.eigeneshaus)
from frog import Frog, Pool
def intro():
"""Lässt das Intro abspielen"""
spielwelt.bgimage = "gamegirl.gif"
waiter = Frog(spielwelt, visible = False)
So ist etwas mehr sorry
so, das erste ist das hauptprogramm, das Zweite sind die Städte und das Dritte ist das Intro.
Habe nun gerade dazu festgestellt, dass der das ganze auf nem anderen PC nicht abspielt dannkommt dann invalid syntax zwischen dem = und dem F bei
spielwelt = Pool(height = 768, width = 1024, bgimage = "gamegirl.gif")
spielwelt.froschliste = []
spielwelt.kirschblüt = Frog(spielwelt, visible = False)
bei dem untersten. Da ich nun eindeutig zu viel Schreibe stopp ich hier mal.
Lg Lisa
Edit:
Hast du Code auf Modulebene, also nicht in Funktionen, der ausgeführt wird?
Ehhhr was heißt das

Verfasst: Samstag 12. Dezember 2009, 16:24
von Dav1d
Es wäre gut wenn du anstatt
[/code] verwenden würdest, so sieht man nichts von der Einrückung
Verfasst: Samstag 12. Dezember 2009, 16:31
von jbs
@Lisa:
Ein `from modul import func` führt auch dazu, dass `def` ausgegben wird, da `print 'def'` auf Modulebene steht.
Verfasst: Samstag 12. Dezember 2009, 17:24
von Midna
Oh ja, habs verstanden
Habe Code auf Modulebene, ist das Schlimm?
Verfasst: Samstag 12. Dezember 2009, 17:29
von cofi
Midna hat geschrieben:Habe Code auf Modulebene, ist das Schlimm?
Ja.
Sofern die Module nur importiert werden, hat nichts ausser Konstanten und Definitionen (und evtl einem ifmain) auf Modulebene zu suchen.
Verfasst: Samstag 12. Dezember 2009, 17:37
von Midna
Hmm okay, werds nun mal löschen, mal sehen was mich dann beschert
Edit:
Oke, habe nun alles auf Moduleben aus den Programmen gelöscht und Tadaaa es hat funktioniert, die Programme führen sich nicht mehr selbst aus. Leider kann aber das intro, wenn ich es hinschreibe, immernoch nicht ausgeführt werden, da spielwelt nicht bekannt ist. spielwelt ist jedoch ein im Hauptprogramm bekanntes Objekt.

Verfasst: Samstag 12. Dezember 2009, 18:01
von ms4py
Wenn "spielwelt" nicht im Modul bekannt ist, indem "intro" definiert ist, funktioniert das nicht. Auch wenn du "intro" im Hauptprogramm ausführst.
Dieses Problem löst man entweder durch Funktionsparameter + Rückgabewerte oder durch ein sauber strukturiertes OO-Design, bei dem alle Abhängigkeiten abgedeckt sind.
Verfasst: Samstag 12. Dezember 2009, 18:09
von Midna
Was ein OO-Design ist, weiß ich schonmal nicht, also bleibt es wohl bei den Rückgabewerten. Was muss den übergeben werden und was zurückgegeben oô
Danke erstmal für die ganze Hilfe, das ist echt super

Verfasst: Samstag 12. Dezember 2009, 19:17
von ms4py
OO - ObjektOrientierung
Design - Entwurf
Ganz knapp bedeutet es den Entwurf deiner Klassen (mit Attributen und Methoden) und wie diese miteinander in Beziehung stehen.
Und das mit Parametern und Rückgabewerten ist doch eigentlich offensichtlich. Wenn du "spielwelt" in der Funktion "intro" benötigst, musst du das als Parameter an "intro" übergeben. Wenn "spielwelt" am Ende der Funktion auf ein anderes Objekt zeigt, musst du dieses von "intro" zurückgeben und im Hauptprogramm neu zuweisen.
Sinnfreies Minimal-Beispiel:
Code: Alles auswählen
class Spielwelt(object):
def __init__(self, var):
self.var = var
def func1(sp_welt):
sp_welt.var = 1
# kein return nötig
def func2(sp_welt):
sp_welt = Spielwelt(3)
# sp_welt zeigt auf neues Object, return nötig
return sp_welt
def main():
sp_welt = Spielwelt(2)
# sp_valt.var ist jetzt 2
func1(sp_welt)
# sp_valt.var ist jetzt 1
sp_welt = func2(sp_welt)
# sp_valt.var ist jetzt 3
Edit: Kommentare ergänzt.
Verfasst: Samstag 12. Dezember 2009, 19:25
von Midna
Dankeschön für die Mühe, ahbs aber nun anders. ich hab intro nun einfach ins Hauptprogramm geschrieben, also nicht in ein eigenes Modul. Nun ist der QT zwar nicht mehr so toll, aber es funktioniert

Verfasst: Samstag 12. Dezember 2009, 19:57
von ms4py
Midna hat geschrieben:Dankeschön für die Mühe, ahbs aber nun anders. ich hab intro nun einfach ins Hauptprogramm geschrieben, also nicht in ein eigenes Modul. Nun ist der QT zwar nicht mehr so toll, aber es funktioniert

Das ist eine sehr schlechte Einstellung "Hauptsache es funktioniert, egal wie". Wenn du selber sogar schon merkst, dass dein Code nicht unbedingt gut ist, ohne dass dich andere darauf aufmerksam machen, solltest du dir einmal Gedanken machen, ob das wirklich der richtige Weg ist, den du mit dieser Argumentation eingeschlagen hast...
Verfasst: Mittwoch 16. Dezember 2009, 17:35
von Midna
Das kann schon sein, aber wir müssen das sehr bald abgeben und wir haben noch recht viel zu tun und da bleibt nicht so viel zeit um uns damit rumzuschlagen
