Problem beim aufrufen einer definierten funktion type error

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
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

#oeffnet .smiles dateien und speichert string in variable molekul

Code: Alles auswählen

def molekul(smiles):
    with open (smiles, "r") as molekuldatei:
         molekul=molekuldatei.readline()

molekul("molekul.smiles")
#TypeError: module object is not callable
Zuletzt geändert von Anonymous am Montag 10. September 2012, 15:09, insgesamt 1-mal geändert.
Grund: Syntaxhervorherbung aktiviert
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

1. Setze deinen Code bitte in Python-Tags. Ohne Einrückung ist schwer zu erkennen wo...

2. Namenskollisionen auftreten könnten. Wenn man alles molekul nennt, ist es vielleicht schwierig zu wissen was sich dahinter verbirgt.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Der `TypeError` kann eigentlich nur dann auftreten, wenn zwischen Funktionsdefinition und Aufruf ein

Code: Alles auswählen

import molekul
gemacht wurde.

Dies kann auch "versehentlich" passiert sein, wenn man mit Sternchen-Importen gearbeitet hat:

Code: Alles auswählen

from molekultools import *
Falls dieses fiktive Modul jetzt seinerseits ein Modul namens `molekul` importiert hat (und der o.g. Sternchen-Import wie gesagt *nach* der Funktionsdefinition stattgefunden hat), dann überschreibt dies den Namen `molekul`, so dass nicht mehr die Funktion daran gebunden ist, sondern das vom Drittmodul importierte `molekul`-Modul (was halt "blind" übernommen wurde).

Irgendwas in dieser Art muss auf jeden Fall passiert sein. Anders ist der Fehler nicht zu erklären.

Ich wette übrigens einen halben Vanille-Joghurt darauf, dass es durch Sternchen-Importe verursacht wurde. Meine Glaskugel hat gerade Andeutungen in dieser Art gemacht...
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

Code: Alles auswählen

sekura@sekura-GA-MA770-UD3:~$ python
Python 2.7.3 (default, Aug  1 2012, 05:16:07) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def molekul(smiles):
...     with open (smiles, "r") as molekuldatei:
...           a=molekuldatei.readline()
... 
>>> molekul("molekul.smiles")
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>>
Zuletzt geändert von Anonymous am Montag 10. September 2012, 15:09, insgesamt 1-mal geändert.
Grund: Code-Formatierung aktiviert
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oh, du solltest dir ganz dringend mal die Funktionsweise von Namensräumen ansehen.

Nichts für ungut, aber auch wenn du nur irgendwelche "Bio-Informatik Klamotten" mit Python machen musst, so ist ein gewisses Grundverständnis der Sprache doch nötig, um einigermaßen mit Python klarzukommen. Es gibt eine deutsche Übersetzung des offiziellen Python-Tutorials, die ziemlich gut ist, aber natürlich auch eine gewisse Einarbeitungszeit erfordert.
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

das bringt nichts ich hab das python von kopf bis fuß buch 3 mal gelesen, ich muss interaktiv lernen, also was much ich wissen?

ich dachte wenn man funktionen definiert kommen die automatisch in _main_ rein? wo ist denn jetzt mein a?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

In der Funktion, in dem with-Block.
Funktionen funktionieren normalerweise so: aufrufen, Parameter übergeben, Ergebnis zurück bekommen.
Daher erwarten Funktionen Parameter und geben über return etwas zurück. Ohne return ist der Rückgabewert immer None.
Was in der Funktion passiert, hat dich in der Regel von "Außen" nicht zu interessieren. Warum erwartest du dann, dass ein in der Funktion (in einem with-Block) definierte Variable außerhalb sichtbar ist?
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

weil ich chemiestudent bin und von programmierung keine ahnung habe.

gilt das auch für schleifen?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nein, für Schleifen gilt es in Python nicht. Hätte man auch leicht durch Ausprobieren herausfinden können:

Code: Alles auswählen

>>> for i in [1, 2, 3]:
...     print i
... 
1
2
3
>>> i
3
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

#oeffnet .smiles dateien und gibts einen string zurueck

Code: Alles auswählen

def molekul(smiles):
    with open (smiles, "r") as molekuldatei:
         a=molekuldatei.readline()
         return a.decode("utf-8-sig").encode("ascii").replace("\n","")
danke das funktioniert jetzt
Zuletzt geändert von Anonymous am Montag 10. September 2012, 15:09, insgesamt 1-mal geändert.
Grund: Syntaxhervorherbung aktiviert
lunar

@flummi Bitte setze Deine Beiträge in Python-Tags. Benutze dazu den "python"-Button direkt über dem Eingabefeld.
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

open.py

Code: Alles auswählen

import re

def fgruppe(pattern, string):
    for gruppe in re.finditer(pattern, string):
          return gruppe.start() 
------------------------------------------------------------------------------------------------------------

>>> open.fgruppe("C",a)

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "open.py", line 2, in fgruppe
    
NameError: global name 're' is not defined

Was will der von mir? ich hab doch re importiert oO ist das wieder diese namensraum geschichte? muss ich irgendwie das re nach namensraum open importieren?!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Lass mich mal raten: du hast ast du dein open-Modul (ein sehr schlechter Name, da dieser einen Standardnamen verdeckt) erstellt, es im interaktiven Interpreter getestet, dort gab es einen Fehler worauf du "import re" hinzugefügt hast. Jetzt gibt es den Fehler immer noch. Das liegt einfach daran, dass das alte open-Modul noch immer geladen wurde, du musst es neu importieren. Wie du das machst, hängt von deinem Interpreter ab.

Und schreibe deine Fragen doch bitte in ganzen zusammenhängenden Sätzen, welche den Fehler und deine Versuche beschreiben. Und das ganze am besten auch noch in einer angemessenen Form. Deinen Post muss man mehrfach lesen um zu erahnen, was du eigentlich sagen willst. Und ich bin mir immer noch nicht sicher, ob ich dich verstanden habe.
Das Leben ist wie ein Tennisball.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Erkennt man übrigens schön daran, dass er den Fehler in Zeile 2 von "open" gefunden hat, wo ja inzwischen etwas ganz anderes steht. Würde er die aktuelle Datei verwenden, hätte er den Fehler in Zeile 4 werfen müssen (bzw. gar nicht, da das Modul ja importiert wird).
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

jo danke
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

Code: Alles auswählen

import re

def fgruppe(pattern, string):
    for gruppe in re.finditer(pattern, string):
          return gruppe.start() 
wenn ich return benutze erhalte ich immer 0 als rückgabewert, benutze ich hingegen print, kriege ich meine gewünschten zahlen, warum?

ich habe vor einen string nach substrings zu durchsuchen und alle startpunkte in eine liste zu schreiben. wie mach ich das? ich weiß dass es mit append gehen muss.

aber brauch ich dafür nicht returnwerte anstelle von print? und wie krieg ichs hin dass jeder einzelne wert in die liste kommt statt in stdout geht?

quasi diese zahlen hier: http://www.saltycrane.com/blog/2007/10/ ... xpression/ in eine liste packen
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das Erstellen von Listen sind absolute Grundlagen, du solltest einen Blick ins Tutorial werfen.
Das Leben ist wie ein Tennisball.
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

Code: Alles auswählen

import re

def fgruppe(pattern, string):
    carboxy=[]
    for match in re.finditer(pattern, string):
          carboxy.append(match.start())
          return carboxy

ich habs so versucht erhalte aber

[0] zurück. Und ich verstehe nicht was da schief läuft.

ich habs mit dem pattern an einer anderen stelle im string versucht und erhalte dann z.b. [5]

es funktioniert also aber nur einmal ;( brauche aber eine liste mit allen match.start
flummi
User
Beiträge: 33
Registriert: Samstag 28. April 2012, 13:33

es lag an der einrückung von return -.-

so langsam raff ichs
Antworten