def read_ms(row):
    if "timeout_ms" in row:
        return row["timeout_ms"]
    return row["timeout_seconds"] * 1000


def write_compatible(row, milliseconds):
    if type(milliseconds) is not int or milliseconds <= 0:
        raise ValueError("超时必须是正整数")
    if milliseconds % 1000:
        raise ValueError("旧读取者退出前不开放毫秒精度")
    row.update(timeout_ms=milliseconds,
               timeout_seconds=milliseconds // 1000)


def backfill(row):
    if "timeout_ms" not in row:
        row["timeout_ms"] = row["timeout_seconds"] * 1000


row = {"timeout_seconds": 2}
assert read_ms(row) == 2000
backfill(row)
backfill(row)  # 回填可重复运行
write_compatible(row, 3000)
assert read_ms(row) == row["timeout_seconds"] * 1000 == 3000
try:
    write_compatible(row, 1500)
except ValueError:
    pass
else:
    raise AssertionError("仍需兼容旧读取者")
print("新旧读取者在兼容阶段得到相同超时")
