Python代码中属性为None引发格式化TypeError问题求助
解决Python中TypeError: unsupported format string passed to NoneType.format错误
运行代码时出现TypeError: unsupported format string passed to NoneType.format错误,原因是pelaaja.nimi、pelaaja.joukkoe、pelaaja.pelipaikka未被正确赋值,最终为None类型,导致格式化字符串时出错。相关代码如下:
相关代码文件
file 1 (db.py)
def luo_turnaus(row): return Turnaus(row["pelaajaid"], row["pelipaikkaid"], row["pelipaikka"], row["joukkoeid"], row["joukkoe"], row["nimi"]) def hae_pelaajat(): query1 = "SELECT pelaaja.*, joukkoe.joukkoe, pelipaikka.pelipaikka FROM pelaaja " query2 = "INNER JOIN joukkoe ON pelaaja.joukkoeid = joukkoe.joukkoeid " query3 = "INNER JOIN pelipaikka ON pelaaja.pelipaikkaid = pelipaikka.pelipaikkaid" query = query1 + query2 + query3 with closing(mydb.cursor(dictionary=True)) as cursor: cursor.execute(query) tulokset = cursor.fetchall() pelaajat = [] for row in tulokset: pelaajat.append(luo_turnaus(row)) return pelaajat
file 2 (oliot.py)
class Turnaus: #alustus def __init__(self, pelaajaid=0, peliid=0, peli=None, joukkoeid=0, joukkoe=None, tehdytmaalit=0, paastetytmaalit=0, nimi=None, pelipaikkaid=0, pelipaikka=None): self.peliid = peliid self.peli = peli self.joukkoeid = joukkoeid self.joukkoe = joukkoe self.tehdytmaalit = tehdytmaalit self.paastetytmaalit = paastetytmaalit self.nimi = nimi self.pelipaikkaid = pelipaikkaid self.pelipaikka = pelipaikka self.pelaajaid = pelaajaid
file 3 (ui.py)
def katso_pelaajat(): print("") print("Kaikki pelaajat") print("-" * 150) line_format = "{:<5} {:<20} {:<15} {:<15}" print(line_format.format("ID", "Nimi", "Joukkoe", "Pelipaikka")) print("-" * 150) pelaajat = db.hae_pelaajat() for pelaaja in pelaajat: print(line_format.format(str(pelaaja.pelaajaid), pelaaja.nimi, pelaaja.joukkoe, pelaaja.pelipaikka)) print("-" * 150)
错误原因
核心问题在于db.py的luo_turnaus函数中,调用Turnaus构造函数的参数顺序与oliot.py中Turnaus.__init__的定义完全不匹配:
Turnaus.__init__的参数顺序为:pelaajaid=0, peliid=0, peli=None, joukkoeid=0, joukkoe=None, tehdytmaalit=0, paastetytmaalit=0, nimi=None, pelipaikkaid=0, pelipaikka=Noneluo_turnaus的传参顺序为:row["pelaajaid"], row["pelipaikkaid"], row["pelipaikka"], row["joukkoeid"], row["joukkoe"], row["nimi"]- 这导致
nimi被传到tehdytmaalit参数位置,joukkoe传到peli位置,pelipaikka传到peliid位置,最终pelaaja.nimi、pelaaja.joukkoe、pelaaja.pelipaikka都保持默认的None值,触发格式化错误。
修复方案
最稳妥的方式是使用关键字参数传递值,彻底避免参数顺序错误:
修改db.py中的luo_turnaus函数:
def luo_turnaus(row): return Turnaus( pelaajaid=row["pelaajaid"], joukkoeid=row["joukkoeid"], joukkoe=row["joukkoe"], nimi=row["nimi"], pelipaikkaid=row["pelipaikkaid"], pelipaikka=row["pelipaikka"] )
如果坚持使用位置参数,必须严格匹配__init__的参数顺序:
def luo_turnaus(row): # 顺序对应:pelaajaid, peliid, peli, joukkoeid, joukkoe, tehdytmaalit, paastetytmaalit, nimi, pelipaikkaid, pelipaikka return Turnaus( row["pelaajaid"], 0, # peliid默认值 None, # peli默认值 row["joukkoeid"], row["joukkoe"], 0, # tehdytmaalit默认值 0, # paastetytmaalit默认值 row["nimi"], row["pelipaikkaid"], row["pelipaikka"] )
修复后,pelaaja.nimi、pelaaja.joukkoe、pelaaja.pelipaikka会被正确赋值,格式化打印即可正常运行。
内容的提问来源于stack exchange,提问作者Jani Uuksulainen
相关产品推荐
相关产品推荐

