1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

オブジェクトを返すとわかっている関数がOptionalと定義されていて扱いにくい場合の回避法

Posted at

Optionalを返す関数に対して、Pyright(Pylance)、mypyではNone出ないことが評価されないと、返されたオブジェクトのプロパティにアクセスしてもエラーとなってしまいます。
これに対して、assert val is not NoneでチェックすればOKというのがシンプルに良さそうと思いました。

# Optional[Way] を返す関数
way1 = repo.get_way(100)

# way1 が None である可能性があるため、mypy、pyrightでエラーになる
print(f"way: {way1.way_id}")


# None で分岐を作るのが正攻法
way2 = repo.get_way(100)
if way2 is not None:
    print(f"way: {way1.way_id}")


# typing.cast や # type: ignore を使うと回避できるが
# 代入したもとの値がWay型であるかの評価がされなくなってしまう 
way3: Way = repo.get_way(100)  # type: ignore
print(f"way: {way3.way_id}")
way4 = typing.cast(Way, repo.get_way(100)) 
print(f"way: {way4.way_id}")


# assert 使えば分岐なしにNoneでないことが評価でき、Pyrightでもエラーにならない
way5 = repo.get_way(100)
assert way5 is not None
print(f"way: {way5.way_id}")
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?