Skip to content

AttributeError: 'str' object has no attribute '__dict__' #173

Description

@craig-matadeen

Hey guys, when trying to create an API context with the latest version of the python package, I get the error in issue title.

The following is the full traceback with the API key removed:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[7], line 2
      1 # Create API context
----> 2 api_context = ApiContext.create(
      3     environment_type=ApiEnvironmentType.PRODUCTION,
      4     api_key="...",
      5     description="..."
      6 )

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/context/api_context.py:66, in ApiContext.create(cls, environment_type, api_key, description, all_permitted_ip, proxy_url)
     64 api_context.__initialize_installation()
     65 api_context.__register_device(description, all_permitted_ip)
---> 66 api_context.__initialize_session()
     68 return api_context

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/context/api_context.py:148, in ApiContext.__initialize_session(self)
    146 def __initialize_session(self) -> None:
    147     from bunq.sdk.model.core.session_server import SessionServer
--> 148     session_server = SessionServer.create(self).value
    150     token = session_server.token
    151     expiry_time = self._get_expiry_timestamp(session_server)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/model/core/session_server.py:74, in SessionServer.create(cls, api_context)
     71 body_bytes = cls.generate_request_body_bytes(api_context.api_key)
     72 response_raw = api_client.post(cls._ENDPOINT_URL_POST, body_bytes, {})
---> 74 return cls._from_json_array_nested(response_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/model/core/bunq_model.py:39, in BunqModel._from_json_array_nested(cls, response_raw)
     37 json = response_raw.body_bytes.decode()
     38 obj = converter.json_to_class(dict, json)
---> 39 value = converter.deserialize(cls, obj[cls._FIELD_RESPONSE])
     41 return BunqResponse(value, response_raw.headers)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:464, in deserialize(cls, obj_raw)
    463 def deserialize(cls: Type[T], obj_raw: JsonValue) -> T:
--> 464     return JsonAdapter.deserialize(cls, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:104, in JsonAdapter.deserialize(cls, cls_target, obj_raw)
    102     return cls._deserialize_default(cls_target, obj_raw)
    103 else:
--> 104     return deserializer.deserialize(cls_target, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/session_server_adapter.py:73, in SessionServerAdapter.deserialize(cls, target_class, array)
     66     session_server.__dict__[cls._ATTRIBUTE_USER_COMPANY] = \
     67         converter.deserialize(
     68             UserCompanyApiObject,
     69             user_dict_wrapped[cls._FIELD_USER_COMPANY]
     70         )
     71 elif cls._FIELD_USER_PERSON in user_dict_wrapped:
     72     session_server.__dict__[cls._ATTRIBUTE_USER_PERSON] = \
---> 73         converter.deserialize(
     74             UserPersonApiObject,
     75             user_dict_wrapped[cls._FIELD_USER_PERSON]
     76         )
     77 elif cls._FIELD_USER_API_KEY in user_dict_wrapped:
     78     session_server.__dict__[cls._ATTRIBUTE_USER_API_KEY] = \
     79         converter.deserialize(
     80             UserApiKeyApiObject,
     81             user_dict_wrapped[cls._FIELD_USER_API_KEY]
     82         )

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:464, in deserialize(cls, obj_raw)
    463 def deserialize(cls: Type[T], obj_raw: JsonValue) -> T:
--> 464     return JsonAdapter.deserialize(cls, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:102, in JsonAdapter.deserialize(cls, cls_target, obj_raw)
     99 deserializer = cls._get_deserializer(cls_target)
    101 if deserializer == cls:
--> 102     return cls._deserialize_default(cls_target, obj_raw)
    103 else:
    104     return deserializer.deserialize(cls_target, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:117, in JsonAdapter._deserialize_default(cls, cls_target, obj_raw)
    115     return obj_raw
    116 elif type(obj_raw) == dict:
--> 117     return cls._deserialize_dict(cls_target, obj_raw)
    118 else:
    119     return cls_target(obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:147, in JsonAdapter._deserialize_dict(cls, cls_target, dict_)
    142 @classmethod
    143 def _deserialize_dict(cls,
    144                       cls_target: Type[T],
    145                       dict_: Dict) -> T:
    146     instance = cls_target.__new__(cls_target)
--> 147     dict_deserialized = cls._deserialize_dict_attributes(cls_target, dict_)
    148     instance.__dict__ = cls._fill_default_values(cls_target, dict_deserialized)
    150     return instance

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:163, in JsonAdapter._deserialize_dict_attributes(cls, cls_context, dict_)
    160     value_specs = cls._get_value_specs(cls_context, key_deserialized)
    162     if value_specs is not None:
--> 163         dict_deserialized[value_specs.name] = cls._deserialize_value(value_specs.types, dict_[key])
    165 return dict_deserialized

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:307, in JsonAdapter._deserialize_value(cls, types, value)
    305     return cls._deserialize_list(types.sub, value)
    306 else:
--> 307     return cls.deserialize(types.main, value)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:102, in JsonAdapter.deserialize(cls, cls_target, obj_raw)
     99 deserializer = cls._get_deserializer(cls_target)
    101 if deserializer == cls:
--> 102     return cls._deserialize_default(cls_target, obj_raw)
    103 else:
    104     return deserializer.deserialize(cls_target, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:117, in JsonAdapter._deserialize_default(cls, cls_target, obj_raw)
    115     return obj_raw
    116 elif type(obj_raw) == dict:
--> 117     return cls._deserialize_dict(cls_target, obj_raw)
    118 else:
    119     return cls_target(obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:147, in JsonAdapter._deserialize_dict(cls, cls_target, dict_)
    142 @classmethod
    143 def _deserialize_dict(cls,
    144                       cls_target: Type[T],
    145                       dict_: Dict) -> T:
    146     instance = cls_target.__new__(cls_target)
--> 147     dict_deserialized = cls._deserialize_dict_attributes(cls_target, dict_)
    148     instance.__dict__ = cls._fill_default_values(cls_target, dict_deserialized)
    150     return instance

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:163, in JsonAdapter._deserialize_dict_attributes(cls, cls_context, dict_)
    160     value_specs = cls._get_value_specs(cls_context, key_deserialized)
    162     if value_specs is not None:
--> 163         dict_deserialized[value_specs.name] = cls._deserialize_value(value_specs.types, dict_[key])
    165 return dict_deserialized

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:307, in JsonAdapter._deserialize_value(cls, types, value)
    305     return cls._deserialize_list(types.sub, value)
    306 else:
--> 307     return cls.deserialize(types.main, value)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:102, in JsonAdapter.deserialize(cls, cls_target, obj_raw)
     99 deserializer = cls._get_deserializer(cls_target)
    101 if deserializer == cls:
--> 102     return cls._deserialize_default(cls_target, obj_raw)
    103 else:
    104     return deserializer.deserialize(cls_target, obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:117, in JsonAdapter._deserialize_default(cls, cls_target, obj_raw)
    115     return obj_raw
    116 elif type(obj_raw) == dict:
--> 117     return cls._deserialize_dict(cls_target, obj_raw)
    118 else:
    119     return cls_target(obj_raw)

File /home/user/miniconda3/envs/financials/lib/python3.12/site-packages/bunq/sdk/json/converter.py:148, in JsonAdapter._deserialize_dict(cls, cls_target, dict_)
    146 instance = cls_target.__new__(cls_target)
    147 dict_deserialized = cls._deserialize_dict_attributes(cls_target, dict_)
--> 148 instance.__dict__ = cls._fill_default_values(cls_target, dict_deserialized)
    150 return instance

AttributeError: 'str' object has no attribute '__dict__'

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions