【发布时间】: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