mk-toolブログ

エンジニアと家のことをごちゃごちゃと書いてます

【python】TypeError: Object of type 'map' is not JSON serializable といわれた

概要

以下のエラーが出たのでメモ。

TypeError: Object of type 'map' is not JSON serializable

解決策

pythonにおいてmapはジェネレータであるらしい。そのため、JSONシリアライズする場合はmapをlistに変換する必要があるので以下のようにする。

list(hoge)

# もしくは
from collections import OrderedDict
OrderedDict(weeds)

参考

stackoverflow.com

関数型プログラミング HOWTO — Python 3.6.5 ドキュメント

【python】TypeError: Object of type 'Decimal' is not JSON serializable と言われた

概要

以下のエラーが出てのでメモ。

TypeError: Object of type 'Decimal' is not JSON serializable

また、Qiiaにすでに解決記事を出している方がおり、私も丸コピなので基本的におなじことをしています。

ドキュメントに以下の記載があります。これを使用します。

default を指定する場合は関数を指定して、この関数はそれ以外では直列化できないオブジェクトに対して呼び出されます。 その関数は、オブジェクトを JSONエンコードできるバージョンにして返すか、さもなければ TypeError を送出しなければなりません。 指定しない場合は、 TypeError が送出されます。

直列化できないオブジェクトに対して呼び出される、つまりオブジェクトが配列であれば配列内の値に対して、2次元配列であれば配列内の配列内の値に対して有効になります。引数として値が渡されてくるので、その値がDecimal型であれば適切にキャストして返す、みたいにすれば良いです。

なんで自分でこんなことを書かないといけないかがわからないのですが、pythonにも都合があるのでしょう。。。 わかる方がいれば教えてください。

解決策

def decimal_default_proc(obj):
    from decimal import Decimal
    if isinstance(obj, Decimal):
        return float(obj)
    raise TypeError
print(json.dumps(value, default=decimal_default_proc))

【Python】NameError: name 'xrange' is not definedと言われる

概要

以下のエラーが出たのでメモ。

NameError: name 'xrange' is not defined

解決策

xrange()はpython3ではrange()にremameされているため、range()にすればOK。

参考

stackoverflow.com

【Python】AttributeError: 'dict' object has no attribute 'has_key'

概要

以下のエラーメッセージが表示されたので対処。

AttributeError: 'dict' object has no attribute 'has_key'

解決策

has_keyはpython3で使えないらしいので、inを使ってキーの存在確認を行う。

if 'Item' in raw_data:
    # code
else:
    # code

参考

https://stackoverflow.com/questions/33727149/dict-object-has-no-attribute-has-key

【Python】Python3でnew.instancemethodが使えないテーブル作成時にエラー

概要

boto3を利用してテーブルを作成する際に以下のエラーが発生したためメモ。

An error occurred (ValidationException) when calling the CreateTable operation: Hash Key not specified in Attribute Definitions.
  Type unknown.

解決方法

テーブル作成時に与えるKeySchemaAttributeDefinitionsの値が一致していない場合に発生。 同じ値を指定すればOK。

【Docker】OCI runtime exec failedと言われた

【概要】 Dockerコンテナに入る際に以下のことを言われたのでメモ。

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown

【解決方法】 docker exec -it [コンテナ名] /bin/bash/bin/bashbin/shにする。