【问题标题】:Python Class Object not callable after loop循环后Python类对象不可调用
【发布时间】:2021-05-26 05:21:42
【问题描述】:

我正在使用类对象来构建数据库。我在两个单独的循环中使用该对象,这样当我开始第一个循环的第二次迭代时(在都经历过一次之后),我收到一条 TypeError 消息,说类“对象”不可调用。我该如何解决这个问题?

import xml.etree.ElementTree as ET
import datetime
import re
import sqlite3
import os
import pathlib

class parameter:
    # defines object
    def __init__(self, id, value):
        self.id = id
        self.value = value
    # defines equility for eliminating duplicates further on
    def __eq__(self, other):
        if (isinstance(other, parameter)):
            return self.id == other.id and self.value == other.value
        return False

db_path = "/Users/miguelnobremenezes/Documents/Code/xml_echo_script/echo.db"
filepath = "/Users/miguelnobremenezes/Documents/Code/xml_echo_script/xml_files"

conn = sqlite3.connect(db_path)
db = conn.cursor()

# Deletes old table
db.execute("DROP TABLE IF EXISTS echo")

# Creates new table with unique ID column
db.execute("CREATE TABLE echo (UNIQUE_ID)")

# Creates a list for adding parameters ie columns to DB
parameter_ids_added_to_db = []

#tree = ET.parse("/Users/mbp2013/Library/Mobile Documents/com~apple~CloudDocs/Documents/Code/xml_echo_script/exemplo.xml")

"""Extracts parameter_value pairs for each XML in directory i.e. patient AND adds unique parameter ids only if non-existent"""
# Iterating every file and respective directory on root folder
for root, dirs, files in os.walk(filepath):
    for filename in files:
        individual_filepath = os.path.join(root, filename)
        print("File name:", filename)
        print("File path:", individual_filepath)
        tree = ET.parse(individual_filepath)
        print("Found XML file\n")
        parameters = []
        unique_parameters = []
        parameter_unique_ids = []

        counter_elem = 0
        counter_display = 0

        for elem in tree.iter():
            print("looping")
            if elem.tag == "Birthdate":
                new_id = elem.tag
                new_id = re.sub("[^\w\s]", "_", new_id)
                new_id = new_id.replace(" ", "_")
                new_id = "pt" + "_" + str(new_id)
                print(new_id)
                if new_id not in parameter_unique_ids:
                    parameter_unique_ids.append(new_id)
                counter_elem +=1
                new_value = elem.text
                print(new_value)
                counter_display += 1
                new_parameter = parameter(new_id, new_value)
                print("added")
                parameters.append(new_parameter)
                print("added")
            
            if elem.tag == "StudyInstanceUID":
                unique_ID = elem.text
                db.execute("INSERT INTO echo (UNIQUE_ID) VALUES (:value)",
                                                {"value": unique_ID})
        
        temp_ids = []
        for parameter in parameters:
            if parameter.id not in temp_ids:
                temp_ids.append(parameter.id)
                unique_parameters.append(parameter)

        """Inserts data into database"""
        # Adds columns to DB if they don't already exist
        for parameter_unique_id in parameter_unique_ids:
            if parameter_unique_id not in parameter_ids_added_to_db:
                db.execute('''ALTER TABLE echo ADD COLUMN ''' + parameter_unique_id)
                parameter_ids_added_to_db.append(parameter_unique_id)

        # Inserts values in specific column for each case
        for unique_parameter in unique_parameters:
            #print(unique_parameter.id)
            #print(unique_parameter.value)
            db.execute("UPDATE echo SET ("+unique_parameter.id+") = :value WHERE UNIQUE_ID = :unique_ID",
                                                {"value": unique_parameter.value, "unique_ID": unique_ID})
        



# Confirm changes to database and close it
conn.commit()
conn.close()

错误是 TypeError: 'parameter' object is not callable

我知道问题出在以下几行:

temp_ids = []
        for parameter in parameters:
            if parameter.id not in temp_ids:
                temp_ids.append(parameter.id)
                unique_parameters.append(parameter)

【问题讨论】:

  • 不要同时使用parameter作为类名和变量
  • 谢谢。但我该怎么做呢?我可以用其他名字给班级打电话吗?
  • 是的。你认为是什么迫使你打电话给班级parameter
  • 没什么,只是一个坏主意 - 解决了它!非常感谢!

标签: python object typeerror callable


【解决方案1】:

你有

class parameter: ...

然后你就有了循环:

for parameter in parameters:

在外循环内。

在外循环的第二次迭代中,名称parameter 仍然指代来自上次迭代for parameter in parameters 的变量。

这意味着任何尝试使用parameter 再次引用该类,即

new_parameter = parameter(new_id, new_value)

会失败。

解决方案是将parameter 变量之一更改为另一个名称(最好是类名,因为它违反了PEP8)。

【讨论】:

  • 很好的解释。再次感谢!
猜你喜欢
  • 2022-06-17
  • 1970-01-01
  • 2022-06-16
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
相关资源
最近更新 更多