Seite 1 von 1

TypeError: 'module' object is not callable

Verfasst: Dienstag 26. März 2019, 08:13
von drnicolas
Ich muss mich als Python-ANfänger bezeichnen.

Ich habe begonnen, ein Python-Programm zu schreiben, welches in mehrern Schritten Dateien bearbeitet/manipuliert.

Zuerst hatte ich für jeden Schritt ein eigenes Python-Programm mit eigener Kommandozeilenauswertung usw.
DIe Idee war, vom Haupt-Skript aus, die einzelnen Tools aufzurufen.

Jetzt habe ich gelesen, daß von dieser Vorgehensweise abgeraten wird.
Man solle stattdessen die einzelnen QUelldateien zu einem Package dazutun und dann vom Hauptprogramm aus die jeweilige Funktion aufrufen.

Und daran hapert es:
So rufe ich die Funtkion auf:

Code: Alles auswählen

_ret=SpiltTIFF(tmpdir,src)
Zuvor wurde ...

Code: Alles auswählen

import SplitTIFF
im Hauptprogramm ausgeführt.


In einer zweiten .py-Datei befindet sich die Funktion:

Code: Alles auswählen

def SplitTIFF(_tmpdir,_src):
....

Ich mache da wohl grundlegend was falsch

Nico

Re: TypeError: 'module' object is not callable

Verfasst: Dienstag 26. März 2019, 09:21
von /me
Ganz klar ist es aus der Beschreibung nicht (und ich gehe davon aus, dass "SpiltTIFF" einfach ein Schreibfehler im Forum ist), aber ich vermute, dass du ein Modul SplitTIFF hast, das eine gleichnamige Funktion SplitTIFF beinhaltet. Aktuell importierst du das Modul und versuchst es als Funktion aufzurufen. Du musst aber die Funktion selber verwenden.

Also entweder

Code: Alles auswählen

import SplitTIFF

return = SplitTIFF.SplitTIFF(tmpdir, src)
oder

Code: Alles auswählen

from SplitTiff import SplitTIFF

return = SplitTIFF(tmpdir, src)
Und bitte keinen falschen Eindruck bekommen. Weder müssen Modulname und Funktionsname identisch sein, noch darf ein Modul nur eine einzige Funktion beinhalten.

Bezugnehmend auf den Style Guide for Python Code sollten Modul- und Funktionsnamen übrigens in Kleinbuchstaben mit trennenden Unterstrichen geschrieben werden.

Re: TypeError: 'module' object is not callable

Verfasst: Dienstag 26. März 2019, 09:56
von __blackjack__
Und wo wir bei Namen sind: ein führender Unterstrich bei einem lokalen Namen (gilt auch für Argumente) kennzeichnet normalerweise Namen die nicht verwendet werden, aber aus irgendwelchen Gründen vorhanden sein müssen. Zum Beispiel beim „tuple unpacking“ oder in Argumentlisten weil der Aufrufer etwas übergibt was man in der Funktion/Methode dann aber gar nicht braucht. ``_ret = …`` ist also etwas komisch, weil man das dann auch einfach weglassen könnte. Zudem ist der Name selbst auch nicht zu besonders, weil es sich anscheinend um eine Abkürzung handelt‽

Edit: Ich habe jetzt erst die führenden Unterstriche bei den Argumenten bei der Definition von der `SplitTIFF()`-Funktion gesehen: Das ist ziemlich sicher falsch!

Re: TypeError: 'module' object is not callable

Verfasst: Sonntag 5. Mai 2019, 14:29
von KevKev
Hallo zusammen

Ich versuche auch mein eigenes Programm zu schreiben. Leider bekomme ich de selbe Fehlermeldung. Versuche nun schon seit längerem auf eine Lösung zu kommen, nur leider stehe ich voll auf dem Schlauch und schaffe es einfach nicht. Hoffe jemand hier kann mir helfen.

Mein Code:

Code: Alles auswählen

import json
import os

togr650 = {}
togr550 = {}
togr450 = {}
tod650 = {}
tod550 = {}
tod450 = {}

dict_names = ("to_gr_650.json", "to_gr_550.json","to_gr_450.json", "to_d_650.json", "to_d_550.json", "to_d_450.json")
as_names = (os.path("gr650"), os.path("gr550"), os.path("gr450"), os.path("d650"), os.path("d550"), os.path("d450"))
dicts = (togr650, togr550, togr450, tod650, tod550, tod450)

def fix_floats(data):
    if isinstance(data,list):
        iterator = enumerate(data)
    elif isinstance(data,dict):
        iterator = data.items()
    else:
        raise TypeError("can only traverse list or dict")

    for i,value in iterator:
        if isinstance(value,(list,dict)):
            fix_floats(value)
        elif isinstance(value,str):
            try:
                data[i] = float(value)
            except ValueError:
                pass

for num, d in enumerate(zip(dict_names),1): 
    for num, a in enumerate(zip(as_names),1):
        for num, d2 in enumerate(zip(dicts),1):
             with open(d, "r") as a:
                 d2 = fix_floats(json.load(a))
                 print(d2)
Die Fehlermeldung sieht wie folgt aus:

Code: Alles auswählen

Traceback (most recent call last):

  File "<ipython-input-15-747a58840eb2>", line 1, in <module>
    runfile('C:/Users/***/Desktop/Python Tecnam Projekt/untitled1.py', wdir='C:/Users***/Desktop/Python Tecnam Projekt')

  File "C:\Users\***\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\Users***\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/***/Desktop/Python Tecnam Projekt/untitled1.py", line 21, in <module>
    as_names = (os.path("gr650"), os.path("gr550"), os.path("gr450"), os.path("d650"), os.path("d550"), os.path("d450"))

TypeError: 'module' object is not callable
Vielen Dank schon jetzt für eure Hilfe.

LG Kevin

Re: TypeError: 'module' object is not callable

Verfasst: Sonntag 5. Mai 2019, 15:03
von __blackjack__
Erkläre mal was so etwas wie `os.path("gr650")` bedeuten soll und wo in der Python-Dokumentation zu `os` oder `os.path` Du den Eindruck gewonnen hast, dass es das bedeutet was Du denkst.

Re: TypeError: 'module' object is not callable

Verfasst: Sonntag 5. Mai 2019, 15:17
von Sirius3
@KevKev: Was glaubst Du, bewirkt `os.path("gr650")`?
Und was denkst Du, tun die drei verschachtelten for-Schleifen?
`num` wird nirgends benutzt, ebensowenig die Laufvariablen `a` oder `d2` der inneren for-Schleifen.