私はNonetype値を持っていますx、それは一般的には数値ですが、あるかもしれませんNone。数値で除算したいのですが、Pythonでは次のように発生します。
TypeError: int() argument must be a string or a number, not 'NoneType'
どうすればこれを解決できますか?
私はNonetype値を持っていますx、それは一般的には数値ですが、あるかもしれませんNone。数値で除算したいのですが、Pythonでは次のように発生します。
TypeError: int() argument must be a string or a number, not 'NoneType'
どうすればこれを解決できますか?
int(None)Noneはintに変換できないため、例外をスローします。あなたの質問への答えはそれができないことです。0や2771、ピンクの象などを置き換えることができますが、何を置き換えても、Noneをintに変換することはできません。
Noneピンクの象にすることで、正式にピンクの象によって数の分割を定義する(そして、あなたがそれをバックアップするためのコードを書いている)ことを、いくつかの番号システムを作業している場合を除き、いずれかのよくない
回答:
コメントの1つで、あなたは言う:
どういうわけか私はNonetype値を取得しました、それはintであるはずですが、今はNonetypeオブジェクトです
それがあなたのコードであるNone場合、あなたが数を期待するときにあなたがどのように得ているかを理解して、それが起こるのを止めてください。
それが他の誰かのコードである場合、それが与える条件を見つけてNone、通常の条件付きコードで、それに使用するための適切な値を決定します。
result = could_return_none(x)
if result is None:
result = DEFAULT_VALUE
...あるいは...
if x == THING_THAT_RESULTS_IN_NONE:
result = DEFAULT_VALUE
else:
result = could_return_none(x) # But it won't return None, because we've restricted the domain.
0ここで自動的に使用する理由はありませんNone。これが必要であるとの仮定の「偽」性に依存するソリューションです。DEFAULT_VALUE(それも存在する場合は)完全にあなたのコードの目的によって異なります。
int(value or 0)
これはFalse、None、0、[]、 ""など、Pythonが考慮する値を提供する場合に0を使用します。0はFalseなので、代替値として0のみを使用する必要があります(そうでない場合、0が見つかりますその値に変わります)。
int(0 if value is None else value)
これはNone0にのみNone置き換えられます。特にテストしているため、他の値を置き換えとして使用できます。
(value or 0)、int型のキャストなしで、値がNoneまたはintのみであることが保証されている場合
この種の状況を処理するための一般的な「Python」の方法は、「許可よりも許しを求める方が簡単」という意味でEAFPとして知られています。これは通常、すべてが適切であると想定してコードを記述することを意味しますが、それをtry..except、そうでない場合にブロックでます。
これが問題に適用されたコーディングスタイルです。
try:
my_value = int(my_value)
except TypeError:
my_value = 0 # or whatever you want to do
answer = my_value / divisor
または、おそらくさらに単純で少し高速です。
try:
answer = int(my_value) / divisor
except TypeError:
answer = 0
逆でより伝統的なアプローチはLBYLとして知られています。これは、「飛躍する前に見る」を意味し、@ Soviutや他の人が提案したものです。このトピックの詳細については、質問に対する私の回答と関連するコメントを参照してください。キーが辞書に存在するかどうかを確認します。このサイトの他の場所に。
EAFPの潜在的な問題の1つは、特に例外が頻繁に発生する場合(したがって、実際には「例外的」なケースではない場合)、使用しているコードまたはサードパーティモジュールの他の部分に問題があるという事実を隠すことができることです。まったく)。
それはTypeErrorあなたが合格しようとしたときにのみ表示されますint() None(唯一であるNoneType私の知る限り、値)。あなたの本当の目標はNoneType、intまたはに変換するstrことではNoneなく、期待どおりに数値の代わりにどこで/なぜ得られているのかを理解し、それを修正するかNone適切に処理することです。
int()ような複素数を渡すとint(1+2j)、が発生TypeErrorしますが、確かにそれはおそらくほとんどありません。とにかく、あなたが言うには、疑いなく、一般的に従うのが良いアドバイスだと思います。
ロジックでNoneが0と同等である限り、このタイプのエラーに対してint(xまたは0)を正常に使用しました。これは、テストxがFalseを返す他の場合にも0に解決されることに注意してください。たとえば、空のリスト、セット、辞書、または長さがゼロの文字列。申し訳ありませんが、キンダルはすでにこの回答を提供しています。
これは、関数から値を返すのを忘れた場合に発生する可能性があります。その後、Noneを返します。その変数に割り当てているすべての場所を見て、それらの1つが関数呼び出しであり、関数にreturnステートメントが欠けているかどうかを確認します。
return代わりに単純な1つ以上のreturnステートメントがありreturn some_expressionます。
return Noneステートメントが含まれている
計算を実行する前に、値がNone でないことを確認する必要があります。
my_value = None
if my_value is not None:
print int(my_value) / 2
注: my_valueコードが機能し、チェックが実行されていることを証明するために、意図的にNoneに設定されました。
is [not] None)
my_value無条件にNoneに設定します。どうして?OP が(Noneでない場合は)「通常は数値」であるint(my_value)ときに、なぜOPが彼がする必要があると考えるのか疑問に思わないでくださいmy_value。
私はpythonの電子メール機能を使用して同じ問題を抱えていました。以下は、電子メールの件名を変数に取得しようとしたコードです。これは、ほとんどの電子メールで正常に機能し、変数が入力されます。Yahooなどからメールを受信し、送信者が件名行に記入しなかった場合、Yahooはメールに件名行を作成せず、関数からNoneTypeが返されます。マルティノーは正解とソビエトを提供しました。IMO Soviutの答えは、プログラミングの観点からはより簡潔です。必ずしもPythonのものではありません。テクニックを示すコードは次のとおりです。
import sys, email, email.Utils
afile = open(sys.argv[1], 'r')
m = email.message_from_file(afile)
subject = m["subject"]
# Soviut's Concise test for unset variable.
if subject is None:
subject = "[NO SUBJECT]"
# Alternative way to test for No Subject created in email (Thanks for NoneThing Yahoo!)
try:
if len(subject) == 0:
subject = "[NO SUBJECT]"
except TypeError:
subject = "[NO SUBJECT]"
print subject
afile.close()
状況によっては、Noneをint 0に変換する関数があると便利です。
def nz(value):
'''
Convert None to int zero else return value.
'''
if value == None:
return 0
return value