You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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=None
  • luo_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:14:53