Seite 1 von 1

Funktionen importieren

Verfasst: Freitag 11. Dezember 2009, 22:19
von Midna
Hallo ich meld mich mal wieder mit einem Problem :oops:

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.

Code: Alles auswählen

from module import *

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:

Code: Alles auswählen

import module
module.func()
c = module.Class()
...
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 :evil:

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 :oops:

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 :shock:

Verfasst: Samstag 12. Dezember 2009, 16:24
von Dav1d
Es wäre gut wenn du anstatt

Code: Alles auswählen

[quote][/quote]

Code: Alles auswählen

[code=py]
[/code] verwenden würdest, so sieht man nichts von der Einrückung

Verfasst: Samstag 12. Dezember 2009, 16:31
von jbs
@Lisa:

Code: Alles auswählen

#modul.py
def func():
    print 'abc'

print 'def'
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 :D

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. :shock:

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 :roll:

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 :roll:
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 :|