Nonetypeをintまたはstringに変換する方法は?


96

私はNonetype値を持っていますx、それは一般的には数値ですが、あるかもしれませんNone。数値で除算したいのですが、Pythonでは次のように発生します。

TypeError: int() argument must be a string or a number, not 'NoneType'

どうすればこれを解決できますか?


5
Noneは2771と同等であると仮定します。しかし、それはあなたが望むものではないかもしれません。詳細を教えてください。
JoshD

どういうわけか、Nonetype値を取得しました。これはintであるはずですが、Nonetypeオブジェクトになりました。別の数値を除算する必要があるため、エラーが発生しました。
user469652

int(None)Noneはintに変換できないため、例外をスローします。あなたの質問への答えはそれができないことです。0や2771、ピンクの象などを置き換えることができますが、何を置き換えても、Noneをintに変換することはできません。
snapshoe

7
@ ma3204。変換Noneピンクの象にすることで、正式にピンクの象によって数の分割を定義する(そして、あなたがそれをバックアップするためのコードを書いている)ことを、いくつかの番号システムを作業している場合を除き、いずれかのよくない
aaronasterling

回答:


49

コメントの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(それも存在する場合は)完全にあなたのコードの目的によって異なります。


5
「正しい」ソリューションの場合は+1。ウィンドウが頻繁に不思議に壊れる場合は、ウィンドウを塞ぐのではなく、その

3
これは、たとえばredis辞書からキーを取得する場合には役立ちません。欠落しているキーはNoneになるためです。それらの存在に関係なくそれらを合計したい場合(これは完全に許容できる動作です)、Noneを0に変換する必要がある場合があります(kindall回答を参照)
spider

1
@spider-それは依然として状況に大きく依存していることを意味し、「実用的な値を決定する」が依然として適用されます。
2013年

スパイダーのポイントはかなり有効ですこの答えは基本的にあなたが何か間違ったことを言っただけですが、なしはそれが未知の値を意味することを意味しません、それはあなたが何か間違ったことを示しているかもしれません、またはスパイダーが欠損値を示唆したように、一般的にそれは来るはずです整数が期待される場合にNoneを使用する可能性が最も高い場合は、おそらく1。
Glen Fletcher

@glenflet入力ドメインと関数の仕様がわからない場合、インターネット上の見知らぬ人がそれを知ることはできません。あなたが知っているが、それを変換するための構文がわからない場合、それはここで尋ねられたものとは完全に異なる質問です。
2015

312
int(value or 0)

これはFalse、None、0、[]、 ""など、Pythonが考慮する値を提供する場合に0を使用します。0はFalseなので、代替値として0のみを使用する必要があります(そうでない場合、0が見つかりますその値に変わります)。

int(0 if value is None else value)

これはNone0にのみNone置き換えられます。特にテストしているため、他の値を置き換えとして使用できます。


64
user469652代わりに、これを受け入れられた回答にすることを検討する必要があります。
見下すの

これがユーザーが直面している問題を解決するかどうかはわかりません。nonetypeを使用して計算を実行します...現在、数値を含むnonetypeを返すREST APIを介してデータを取得しています。0に設定するかそのままにしておくと、何もできません
br3w5

2
おそらく関数のように、ユーザーがNoneが期待されるべきであり、値が不明であることを示すためにNoneを返す何かの値を要求することをユーザーが示すため、これは間違いなく最良の回答です。この場合、Noneがデフォルト値になるはずですその使用例では、通常は0です。izip_longestのデフォルトの引数を検討してください。異なるものには異なるデフォルト(タイプも)があり、デフォルトはNoneである必要があります。これはデフォルトに置き換えられますが、文字列です。<align_n> (str、w)は幅の整数のみを受け取ります。
グレンフレッチャー

2
これを使用して、それはエレガントで、私の問題を解決しました。
Dan Safee、2015

1
使用できるのは(value or 0)、int型のキャストなしで、値がNoneまたはintのみであることが保証されている場合
ハッシュラッシュ

16

この種の状況を処理するための一般的な「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つは、特に例外が頻繁に発生する場合(したがって、実際には「例外的」なケースではない場合)、使用しているコードまたはサードパーティモジュールの他の部分に問題があるという事実を隠すことができることです。まったく)。


11

それはTypeErrorあなたが合格しようとしたときにのみ表示されますint() None(唯一であるNoneType私の知る限り、値)。あなたの本当の目標はNoneTypeintまたはに変換するstrことではNoneなく、期待どおりに数値の代わりにどこで/なぜ得られているのかを理解し、それを修正するかNone適切に処理することです。


int()ような複素数を渡すとint(1+2j)、が発生TypeErrorしますが、確かにそれはおそらくほとんどありません。とにかく、あなたが言うには、疑いなく、一般的に従うのが良いアドバイスだと思います。
martineau 2017年

5

Python 3では、「or」キーワードも使用できます。こちらです:

foo = bar or 0
foo2 = bar or ""

2

ロジックでNoneが0と同等である限り、このタイプのエラーに対してint(xまたは0)を正常に使用しました。これは、テストxがFalseを返す他の場合にも0に解決されることに注意してください。たとえば、空のリスト、セット、辞書、または長さがゼロの文字列。申し訳ありませんが、キンダルはすでにこの回答を提供しています。


1

これは、関数から値を返すのを忘れた場合に発生する可能性があります。その後、Noneを返します。その変数に割り当てているすべての場所を見て、それらの1つが関数呼び出しであり、関数にreturnステートメントが欠けているかどうかを確認します。


1
...または、関数には、のreturn代わりに単純な1つ以上のreturnステートメントがありreturn some_expressionます。
John Machin、

...または関数に1つ以上のreturn Noneステートメントが含まれている
John Machin

1

計算を実行する前に、値がNone でないことを確認する必要があります。

my_value = None
if my_value is not None:
    print int(my_value) / 2

注: my_valueコードが機能し、チェックが実行されていることを証明するために、意図的にNoneに設定されました。


1
同一性比較を使用する必要があります(is [not] None
shylent

-4 OPを回避するのではなく、OPの実際の問題を見つけるように奨励する必要があります。@shylentが言ったこと。my_value無条件にNoneに設定します。どうして?OP が(Noneでない場合は)「通常は数値」であるint(my_value)ときに、なぜOPが彼がする必要があると考えるのか疑問に思わないでくださいmy_value
John Machin

1
概念実証としてmy_valueをNoneに設定して、コードが失敗しないことを示しています。値が常に数値であるとは限らない理由がたくさんあり、計算を実行する前にそれが正しいかどうかを確認することは良い考えであるため、OPには質問しませんでした。OPの質問に単に答えることは何の問題もありません。私は彼らのためにすべての宿題をする必要はありません。
ソビエト

1

私は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()

1

状況によっては、Noneをint 0に変換する関数があると便利です。

def nz(value):

    '''
    Convert None to int zero else return value.
    '''

    if value == None:
        return 0
    return value
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.