Funktionen importieren

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
Midna
User
Beiträge: 12
Registriert: Donnerstag 26. November 2009, 14:17
Kontaktdaten:

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
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ja, aber es wird nicht empfohlen, da man nie weiß, was man da alles importiert.

Code: Alles auswählen

from module import *
Bottle: Micro Web Framework + Development Blog
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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Midna
User
Beiträge: 12
Registriert: Donnerstag 26. November 2009, 14:17
Kontaktdaten:

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Lass mich raten: Du hast Defnulls Hinweis ueberlesen und per * importiert?
Ansonsten solltest du uns mal mit Code fuettern.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hast du Code auf Modulebene, also nicht in Funktionen, der ausgeführt wird?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Midna
User
Beiträge: 12
Registriert: Donnerstag 26. November 2009, 14:17
Kontaktdaten:

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:
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

@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.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Midna
User
Beiträge: 12
Registriert: Donnerstag 26. November 2009, 14:17
Kontaktdaten:

Oh ja, habs verstanden :D

Habe Code auf Modulebene, ist das Schlimm?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Midna
User
Beiträge: 12
Registriert: Donnerstag 26. November 2009, 14:17
Kontaktdaten:

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:
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Midna
User
Beiträge: 12
Registriert: Donnerstag 26. November 2009, 14:17
Kontaktdaten:

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 :)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Midna
User
Beiträge: 12
Registriert: Donnerstag 26. November 2009, 14:17
Kontaktdaten:

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:
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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...
Midna
User
Beiträge: 12
Registriert: Donnerstag 26. November 2009, 14:17
Kontaktdaten:

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