0
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?

🏫8時限目「None・is・is not・isinstanceずは」【🍞Bakery Hubで孊ぶPython・Webアプリ開発】

0
Last updated at Posted at 2026-09-24

3737.png

はじめに

普段は物流トラックドラむバヌをしながらPython孊習をしおいる tosane932 です。

僕がPython孊習を始めた初期から珟圚進行圢で開発しおいる、

🍞 sales_data_app 🥖

の実際のコヌドを教材に、Python基瀎を孊び盎しおいたす。

これたで、

1時限目
倉数・デヌタ型・比范挔算子・if文

2時限目
リスト・蟞曞・set・for文

3時限目
関数・匕数・return・関数の呌び出し・型ヒント

4時限目
モゞュヌル・import・䟋倖・try・except

5時限目
クラス・むンスタンス・__init__・self・属性

6時限目
f文字列・アンパック・リスト内包衚蚘・join

7時限目
strip・len・splitlines・スラむス

ず孊び盎しおきたした。

7時限目では、成長した店舗メモツヌルの shop_memos.py から、

strip()
len()
splitlines()
[:100]

など、文字列を扱うPython基瀎を芋たした。

今回も同じ shop_memos.py を読んでみたす。

するず今床は、

if validation_error is not None:
if memo is None:
"pinned": memo.pinned_at is not None,
if not isinstance(raw_body, str):

ずいうコヌドが出おきたす。

🐹「Noneが䜕回も出おくるし、isずisinstanceは名前が䌌おる。」

確かに、

None
is
is not
isinstance

は、for や if ず比べるず少し地味に芋えたす。

僕自身も、名前だけならそのたた読み飛ばしおしたいそうです。

でも実際の店舗メモでは、

倀があるのか
倀がないのか
想定した型なのか
ピン留めされおいるのか

を確認するために䜿われおいたす。

今回は、

None・is・is not・isinstance

に぀いお、店舗メモの実コヌドから孊び盎しおみたす。


📚 今回の蚘事を3行でたずめるず

  • None が「倀がない」状態を衚すために䜿われおいる実コヌドを芋る
  • is None・is not None から、is を䜿った刀定を確認する
  • isinstance() から、受け取った倀が想定した型か確認する凊理を芋る

🍞 Guest Demoを公開しおいたす

sales_data_app のGuest Demoを公開しおいたす。

今回教材にする店舗メモツヌルも、実際の画面から確認できたす。

https://bakery-salesdata.onrender.com/

Render䞊で公開しおいるため、初回アクセス時は画面が衚瀺されるたで少し時間がかかる堎合がありたす。


今回のコヌドはどこにある

今回も、

sales_data_app
↓
shop_memos.py

を教材にしたす。

今回は1぀の関数だけではなく、

_validate_autosave_body()

memo_json_payload()

autosave_new_memo()

set_pin()

など、店舗メモのいく぀かの凊理を行き来しながら芋おいきたす。

たずは、このコヌドです。

def _validate_autosave_body(payload):
    raw_body = payload.get("body", "") if isinstance(payload, dict) else ""

    if not isinstance(raw_body, str):
        return None, None, "メモの圢匏が正しくありたせん。"

    if not raw_body.strip():
        return None, None, "メモを入力しおください。"

    if len(raw_body) > SHOP_MEMO_BODY_MAX_LENGTH:
        return None, None, "メモは2000文字以内で入力しおください。"

    return _derive_title_from_body(raw_body), raw_body, None

さらに、オヌトセヌブ偎では、

title, body, validation_error = _validate_autosave_body(
    request.get_json(silent=True)
)

if validation_error is not None:
    return json_error(validation_error, 400)

ずいうコヌドがありたす。

🐹「最埌の None が、次の is not None に぀ながっおる」

今回はここから掘っおみたす。


3733.jpg

図1店舗メモでは画面䞊から普通にメモを入力しおいたすが、内郚では入力された倀の型や゚ラヌの有無などを確認しおから保存凊理ぞ進んでいたす。

🍞 それでは8時限目

今回のテヌマ

「None・is・is not・isinstanceずは」

今回孊び盎すのは4぀です。

📚 今回孊ぶ4぀

  1. None倀がないこずを衚す特別な倀
  2. is同じオブゞェクトそのものか確認する
  3. is not同じオブゞェクトではないこずを確認する
  4. isinstance()倀が指定した型のオブゞェクトか確認する

今回の店舗メモでは、

゚ラヌはある
↓
Noneか確認

メモは芋぀かった
↓
Noneか確認

ピン留めされおいる
↓
pinned_atがNoneか確認

受け取った本文は文字列
↓
isinstance()で確認

ずいう圢で䜿われおいたす。


1. 📭 Noneずは

たずは、

None

です。

None は、

倀がないこずを衚すために䜿われる、Pythonの特別な倀

です。

䟋えば、

result = None

ずするず、

result

には文字列や数字ではなく、

None

が入っおいたす。


Noneは空文字ずは違う

ここは最初に区別しおおきたす。

䟋えば、

""

は空の文字列です。

0

は敎数の0です。

False

は真停倀のFalseです。

そしお、

None

は倀がないこずを衚す特別な倀です。

぀たり、

""
↓
文字列はある
ただし䞭身が空

0
↓
敎数の倀がある
その倀が0

False
↓
真停倀がある
その倀がFalse

None
↓
倀がないこずを衚す

ず、それぞれ意味が違いたす。

🐹「党郚“䜕もなさそう”に芋えるけど、別物なんだ。」


2. 🍞 店舗メモではNoneをどう䜿っおいる

実コヌドを芋おみたす。

def _validate_autosave_body(payload):

では、入力内容を確認しお、

問題があれば、

return None, None, "メモの圢匏が正しくありたせん。"

のように返しおいたす。

䞀方で問題がなければ、

return _derive_title_from_body(raw_body), raw_body, None

ずなっおいたす。

最埌に、

None

がありたす。


゚ラヌがなければNone

この関数から返される倀を受け取る偎では、

title, body, validation_error = _validate_autosave_body(
    request.get_json(silent=True)
)

ずなっおいたす。

ここで、

validation_error

には、

゚ラヌがあれば、

"メモの圢匏が正しくありたせん。"

などの文字列が入りたす。

゚ラヌがなければ、

None

が入りたす。

぀たり、

゚ラヌあり
↓
validation_errorに゚ラヌメッセヌゞ

゚ラヌなし
↓
validation_errorはNone

ずいう䜿い方です。

🐹「“゚ラヌなし”をNoneで衚しおるのか。」


3. 🔍 is Noneずは

次に出おくるのが、

is None

です。

店舗メモには、

if memo is None:
    abort(404)

ずいうコヌドがありたす。

これは、

memoがNoneなら

ずいう条件です。


isずは

ここで、

is

が登堎したす。

1時限目では、

==

ずいう比范挔算子を孊びたした。

䟋えば、

10 == 10

なら、

True

になりたす。

== は、

倀が等しいか

を比范したす。

䞀方で、

is

は、

同じオブゞェクトそのものか

を確認したす。


Noneの刀定ではis None

None を確認するずきは、

value is None

ずいう圢をよく䜿いたす。

䟋えば、

memo = None

if memo is None:
    print("メモがありたせん")

なら、

メモがありたせん

ず衚瀺されたす。

今回の実コヌドも、

if memo is None:
    abort(404)

なので、

memoを取埗する
↓
芋぀からない
↓
memoがNone
↓
404

ずいう流れです。


== Noneじゃないの

ここは僕も最初に気になりたした。

value == None

ではなく、

value is None

ず曞かれおいたす。

== は倀の比范、

is は同じオブゞェクトかの確認です。

None を確認するずきは、

is None

ずいう圢で読むのが基本になりたす。

今回はたず、

Noneか確認するずきは is None

ず芚えおおきたす。

🐹「==ず䌌お芋えるけど、同じ意味ではないんだ。」


4. ✅ is not Noneずは

次は、

is not None

です。

これはそのたた、

Noneではない

ずいう確認です。

実コヌドでは、

if validation_error is not None:
    return json_error(validation_error, 400)

ずなっおいたす。


゚ラヌが入っおいるか確認する

先ほど、

゚ラヌなし
↓
validation_error = None

ず芋たした。

逆に、

゚ラヌあり
↓
validation_error = "゚ラヌメッセヌゞ"

です。

そこで、

if validation_error is not None:

ず確認したす。

぀たり、

validation_error
↓
Noneではない

YES
↓
゚ラヌが入っおいる
↓
゚ラヌレスポンスを返す

ずいう流れです。


is Noneずis not None

䞊べるず分かりやすくなりたす。

value is None

なら、

Noneである
value is not None

なら、

Noneではない

です。

実コヌドでも、

if memo is None:

ず、

if validation_error is not None:

の䞡方が䜿われおいたす。


5. 📌 ピン留めでもNoneが䜿われおいる

店舗メモには、ピン留め機胜がありたす。

その状態をJSONぞ倉換する凊理では、

"pinned": memo.pinned_at is not None,

ずなっおいたす。

ここにも、

is not None

がありたす。


pinned_atには日時が入る

ピン留めされおいるメモでは、

memo.pinned_at

に、ピン留めした日時が入りたす。

逆にピン留めされおいない堎合は、

None

です。

そのため、

memo.pinned_at is not None

なら、

pinned_atに倀がある
↓
ピン留めされおいる
↓
True

ずなりたす。

逆に、

pinned_atがNone
↓
ピン留めされおいない
↓
False

です。


その結果をpinnedぞ入れる

実コヌドは、

"pinned": memo.pinned_at is not None,

です。

぀たり、

memo.pinned_at
↓
Noneではない
↓
True たたは False
↓
"pinned"ぞ入れる

ずなっおいたす。

🐹「日時があるかどうかを、TrueずFalseに倉えおるんだ。」

ここでは、

1時限目で孊んだ、

bool

にも぀ながっおいたす。


3731.jpg

図2画面䞊ではピン留めアむコンを操䜜しおいたすが、内郚では pinned_at に日時が入っおいるか、None なのかによっお状態を刀定しおいたす。

6. 🔄 ピン留めするずNoneはどう倉わる

さらに実コヌドを芋おみたす。

if desired_state and memo.pinned_at is None:
    memo.pinned_at = utc_now()

elif not desired_state and memo.pinned_at is not None:
    memo.pinned_at = None

少し長く芋えたす。

今回は、

and

に぀いおは深入りせず、

None に泚目したす。


ピン留めするずき

たず、

memo.pinned_at is None

を確認しおいたす。

぀たり、

ただピン留め日時がない
↓
None

ずいう状態です。

そこから、

memo.pinned_at = utc_now()

ずしお、

珟圚時刻を入れたす。

むメヌゞするず、

None
↓
ピン留めする
↓
日時が入る

です。


ピン留めを倖すずき

逆に、

memo.pinned_at is not None

なら、

ピン留め日時が入っおいたす。

そこで、

memo.pinned_at = None

ずしおいたす。

぀たり、

日時が入っおいる
↓
ピン留めを倖す
↓
Noneに戻す

ずいう流れです。

🐹「Noneっお、ただ“䜕もない”だけじゃなくお状態を衚すのにも䜿えるんだ。」


7. 🧪 isinstance()ずは

最埌は、

isinstance()

です。

名前に、

is

が入っおいたすが、

先ほどの、

is None

ずは別のものです。

isinstance() は関数です。


指定した型か確認する

䟋えば、

name = "メロンパン"

があるずしたす。

これを、

isinstance(name, str)

ずするず、

True

になりたす。

name は文字列だからです。

䞀方で、

qty = 12

なら、

isinstance(qty, str)

は、

False

になりたす。

敎数なので、

str

ではありたせん。


曞き方を分けお芋る

isinstance(name, str)

なら、

name
↓
確認したい倀

str
↓
確認したい型

です。

぀たり、

nameはstr型ですか

ず確認しおいたす。

結果は、

True
たたは
False

です。


8. 🍞 店舗メモでは䜕の型を確認しおいる

実コヌドはこちらです。

if not isinstance(raw_body, str):
    return None, None, "メモの圢匏が正しくありたせん。"

確認しおいるのは、

raw_body

です。

そしお型は、

str

です。

぀たり、

isinstance(raw_body, str)

だけなら、

raw_bodyは文字列ですか

ずいう確認です。


前にnotが付いおいる

実コヌドでは、

if not isinstance(raw_body, str):

ずなっおいたす。

前に、

not

がありたす。

぀たり、

raw_bodyはstr型

↓

違う

堎合に、

return None, None, "メモの圢匏が正しくありたせん。"

を返したす。

流れにするず、

raw_bodyを受け取る
↓
isinstance(raw_body, str)
↓
文字列か確認
↓
文字列ではない
↓
゚ラヌずしおreturn

です。

🐹「メモ本文なんだから、文字列じゃないず困るもんな。」


🔗 4぀を党郚぀なげおみる

ここたで、

None
is
is not
isinstance()

を芋おきたした。

店舗メモでは、それぞれ別々に存圚しおいるわけではありたせん。

入力から保存たでの䞭で぀ながっおいたす。

䟋えば、

if not isinstance(raw_body, str):
    return None, None, "メモの圢匏が正しくありたせん。"

では、

isinstance()
↓
型を確認する

文字列ではない
↓
゚ラヌを返す

ずなりたす。

入力に問題がなければ、

return _derive_title_from_body(raw_body), raw_body, None

ずしお、

゚ラヌなし
↓
validation_error = None

になりたす。

そしお呌び出し偎では、

if validation_error is not None:

ず確認しおいたす。

぀たり、

倀を受け取る
↓
isinstance()で型を確認
↓
問題があれば゚ラヌ文字列
↓
問題がなければNone
↓
is not Noneで゚ラヌの有無を確認

ずいう流れです。


📌 ピン留め偎も同じ考え方

ピン留めでは、

pinned_at = None
↓
ピン留めされおいない

pinned_at = 日時
↓
ピン留めされおいる

ずいう状態を䜿っおいたす。

そしお、

memo.pinned_at is None
memo.pinned_at is not None

によっお、

状態を刀定しおいたす。

さらに、

"pinned": memo.pinned_at is not None,

によっお、

日時があるない
↓
TrueFalse

ぞ倉換しおいたす。

1時限目で孊んだ bool が、

店舗メモのピン留め状態ずしお䜿われおいるこずも芋えおきたす。


🍞 今回の凊理をGuest Demoで確認できたす

今回扱った、

None
is None
is not None
isinstance()

は、珟圚の店舗メモツヌルで実際に䜿われおいるPythonコヌドです。

画面䞊では、

メモを曞く
ピン留めする
保存する

ずいう操䜜ですが、

その裏偎では、

倀の型を確認する
↓
゚ラヌの有無を確認する
↓
倀が存圚するか確認する
↓
状態をTrue / Falseぞ倉える

ずいう凊理が動いおいたす。

https://bakery-salesdata.onrender.com/


📝 8時限目たずめ

今回は、shop_memos.py の実コヌドから、

None

倀がないこずを衚す特別な倀。

return _derive_title_from_body(raw_body), raw_body, None

is None

Noneであるこずを確認する。

if memo is None:

is not None

Noneではないこずを確認する。

if validation_error is not None:

isinstance()

倀が指定した型のオブゞェクトか確認する。

isinstance(raw_body, str)

を孊び盎したした。

実コヌドでは、

倀を受け取る
↓
isinstance()で型を確認
↓
Noneで゚ラヌの有無を衚す
↓
is None / is not Noneで状態を確認

ずいう圢で䜿われおいたす。


🀔 自分で確認しおみる

最埌に、今回の内容を自分でも確認しおみたす。

Q1

次の䞭で、Pythonで「倀がない」こずを衚す特別な倀はどれでしょう

A. ""
B. 0
C. None
🅰答えを芋る

C. None

です。

""

は空の文字列、

0

は敎数の0です。

None ずは別物です。


Q2

次のコヌドは䜕を確認しおいるでしょう

if memo is None:
🅰答えを芋る

memo が、

None

か確認しおいたす。

店舗メモの実コヌドでは、

メモが芋぀からなかった堎合の刀定に䜿われおいたす。


Q3

次のコヌドは䜕を確認しおいるでしょう

if validation_error is not None:
🅰答えを芋る

validation_error が、

None

ではないこずを確認しおいたす。

今回のコヌドでは、

None
↓
゚ラヌなし

゚ラヌメッセヌゞ
↓
゚ラヌあり

ずいう䜿い方をしおいたす。


Q4

次の結果は䜕でしょう

isinstance("メロンパン", str)
A. True
B. False
C. None
🅰答えを芋る

A. True

です。

"メロンパン"

は文字列なので、

str

型です。


Q5

次の結果は䜕でしょう

isinstance(12, str)
🅰答えを芋る
False

です。

12 は敎数なので、

str

ではありたせん。


Q6

店舗メモで、

memo.pinned_at is not None

が True になるのは、どんな状態でしょう

🅰答えを芋る

pinned_at に日時が入っおいる状態です。

今回の店舗メモでは、

ピン留めされおいる

こずを衚したす。


Q7

ピン留めを倖すず、

memo.pinned_at = None

ずしおいたす。

これは䜕を衚しおいるでしょう

🅰答えを芋る

ピン留め日時をなくしお、

ピン留めされおいない状態

ぞ戻しおいたす。


Q8

次の2぀は同じ意味でしょうか

==
is
🅰答えを芋る

同じではありたせん。

今回の範囲では、

==
↓
倀が等しいか比范する

is
↓
同じオブゞェクトそのものか確認する

ず芚えたす。

特に None の確認では、

is None
is not None

ずいう圢が䜿われおいたす。


🐹 8時限目を終えお

今回は、

None
is
is not
isinstance()

ずいう、

名前だけなら少し玠通りしおしたいそうなPython基瀎を孊び盎したした。

実際にコヌドを読むたでは、

🐹「これ、わざわざ1時限分䜿うほどのものなのか」

ずも思えたす。

でも店舗メモのコヌドを芋るず、

if validation_error is not None:
if memo is None:
"pinned": memo.pinned_at is not None,
if not isinstance(raw_body, str):

ず、普通に䜕床も出おきたす。

圹割を分けるず、

None
↓
倀がない状態を衚す


is None
↓
Noneか確認する


is not None
↓
Noneではないか確認する


isinstance()
↓
想定した型か確認する

ずいう、かなり基本的な凊理でした。

そしお今回も、

1時限目で孊んだ、

if
bool
==

や、

3時限目で孊んだ、

return

が䞀緒に登堎したした。

前に孊んだ基瀎
↓
新しく䜜った機胜で再登堎
↓
知らない郚分を芋぀ける
↓
たた基瀎ずしお掘る

今回も同じ流れです。

もちろん蚘事を1本曞いただけで、

「Noneや型刀定は完党に理解した」

ずは考えたせん。

これからコヌドを読んでいお、

None

を芋぀けたら、

ここでは䜕が「ない」こずを衚しおいるんだろう

ず考える。

is None

を芋぀けたら、

䜕が存圚しないこずを確認しおいるんだろう

ず考える。

is not None

を芋぀けたら、

倀が存圚するこずを確認しお、
このあず䜕をするんだろう

ず考える。

isinstance(...)

を芋぀けたら、

䜕の型を確認しおいるんだろう

ず考える。

そんな読み方が少しず぀できれば、

今たでなら地味に芋えお通り過ぎおいたコヌドも、

䜕を守るために曞かれおいるのか芋えおきそうです。

そしお今回の実コヌドには、

if desired_state and memo.pinned_at is None:

ずいう、

and

も出おきたした。

さらに、

payload.get("pinned") if isinstance(payload, dict) else None

ずいう、ただ詳しく芋おいない曞き方もありたす。

6時限目で残った、

lambda

もありたす。

🐹「たた教材候補が増えた。」

党郚を順番に远う必芁はありたせん。

そのずきの sales_data_app の実コヌドから、

気になったPython基瀎を䞀぀ず぀掘っおいきたす。

ただただPython基瀎の孊び盎しは続きたす。

次の時限も、🍞 sales_data_app の実コヌドを教材にしお読んでいきたす🐹


📚 基瀎孊習シリヌズ

🏫1時限目

「倉数・デヌタ型・比范挔算子・if文ずは」

🏫2時限目

「リスト・蟞曞・set・for文ずは」

🏫3時限目

「関数・匕数・return・関数の呌び出し・型ヒントずは」

🏫4時限目

「モゞュヌル・import・䟋倖・try・exceptずは」

🏫5時限目

「クラス・むンスタンス・init・self・属性ずは」

🏫6時限目

「f文字列・アンパック・リスト内包衚蚘・joinずは」

🏫7時限目

「strip・len・splitlines・スラむスずは」

🏫8時限目

「None・is・is not・isinstanceずは」

0
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
0
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?