简体   繁体   中英

How to fix 'TypeError: isinstance() arg 2 must be a type or tuple of types' during running tests in django in docker on windows

I recently moved to docker. My application is working right now. I'm running python manage.py test in my project. But i got tons of errors 'TypeError: isinstance() arg 2 must be a type or tuple of types'.

Same setup works under linux machine. And right now I am using Windows 10 one. Main docker image is ubuntu14.04, using python version 3.5.2, here is my pip freeze:

amqp==2.5.0
atomicwrites==1.3.0
attrs==19.1.0
Babel==2.7.0
backcall==0.1.0
billiard==3.5.0.2
celery==4.1.0
decorator==4.4.0
dictdiffer==0.5.0.post1
dicttoxml==1.6.6
Django==2.0.2
django-common-helpers==0.9.2
django-cron==0.5.0
django-model-utils==3.0.0
django-params==0.3
django-pipeline==1.6.8
django-pytest==0.2.0
django-ranged-response==0.2.0
django-redis==4.8.0
django-simple-captcha==0.5.9
django-widget-tweaks==1.4.1
djangorestframework==3.7.7
et-xmlfile==1.0.1
factory-boy==2.8.1
Faker==0.7.7
fakeredis==0.8.2
flower==0.9.2
importlib-metadata==0.17
ipdb==0.12
ipython==7.5.0
ipython-genutils==0.2.0
jdcal==1.4.1
jedi==0.13.3
Jinja2==2.10.1
JPype1==0.6.1
kombu==4.1.0
lxml==3.6.0
MarkupSafe==1.1.1
more-itertools==7.0.0
openpyxl==2.4.1
packaging==19.0
parso==0.4.0
pathlib2==2.3.3
pexpect==4.7.0
pickleshare==0.7.5
Pillow==2.7.0
pluggy==0.12.0
prompt-toolkit==2.0.9
psycopg2==2.7.5
ptyprocess==0.6.0
py==1.8.0
Pygments==2.4.2
pyparsing==2.4.0
pytest==4.6.2
pytest-django==3.5.0
python-dateutil==2.8.0
pytz==2016.3
redis==2.10.6
reportlab==3.3.0
six==1.12.0
sqlparse==0.1.0
tornado==5.1.1
traitlets==4.3.2
vine==1.3.0
wcwidth==0.1.7
xlwt==1.1.2
zipp==0.5.1

self = <django.db.models.fields.DateTimeField: created_at>, value = datetime.datetime(2019, 6, 5, 16, 23, 2, 463090)

    def to_python(self, value):
        if value is None:
            return value
>       if isinstance(value, datetime.datetime):
E       TypeError: isinstance() arg 2 must be a type or tuple of types

/usr/local/lib/python3.5/dist-packages/django/db/models/fields/__init__.py:1353: TypeError

and here is full trace

Traceback (most recent call last):
  File "/code/app/app/test_api.py", line 19, in setUp
    self.user= UserFactory(role=User.ROLE_ADMIN, is_superuser=True)
  File "/usr/local/lib/python3.5/dist-packages/factory/base.py", line 69, in __call__
    return cls.create(**kwargs)
  File "/usr/local/lib/python3.5/dist-packages/factory/base.py", line 622, in create
    attrs = cls.attributes(create=True, extra=kwargs)
  File "/usr/local/lib/python3.5/dist-packages/factory/base.py", line 453, in attributes
    force_sequence=force_sequence,
  File "/usr/local/lib/python3.5/dist-packages/factory/containers.py", line 324, in build
    return stub.__fill__()
  File "/usr/local/lib/python3.5/dist-packages/factory/containers.py", line 83, in __fill__
    res[attr] = getattr(self, attr)
  File "/usr/local/lib/python3.5/dist-packages/factory/containers.py", line 108, in __getattr__
    val = val.evaluate(self, self.__containers)
  File "/usr/local/lib/python3.5/dist-packages/factory/containers.py", line 227, in evaluate
    containers=containers,
  File "/usr/local/lib/python3.5/dist-packages/factory/declarations.py", line 324, in evaluate
    return self.generate(sequence, obj, create, defaults)
  File "/usr/local/lib/python3.5/dist-packages/factory/declarations.py", line 412, in generate
    return subfactory.simple_generate(create, **params)
  File "/usr/local/lib/python3.5/dist-packages/factory/base.py", line 709, in simple_generate
    return cls.generate(strategy, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/factory/base.py", line 676, in generate
    return action(**kwargs)
  File "/usr/local/lib/python3.5/dist-packages/factory/base.py", line 623, in create
    return cls._generate(True, attrs)
  File "/usr/local/lib/python3.5/dist-packages/factory/base.py", line 548, in _generate
    obj = cls._prepare(create, **attrs)
  File "/usr/local/lib/python3.5/dist-packages/factory/base.py", line 523, in _prepare
    return cls._create(model_class, *args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/factory/django.py", line 181, in _create
    return manager.create(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/query.py", line 417, in create
    obj.save(force_insert=True, using=self.db)
  File "/code/clinica/audit_track/models.py", line 32, in save
    super(UpdatedAtMixin, self).save(*args, **kwargs)
  File "/code/clinica/audit_track/models.py", line 98, in save
    super(CreatedByMixin, self).save(*args, **kwargs)
  File "/code/clinica/audit_track/models.py", line 116, in save
    super(UpdatedByMixin, self).save(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/base.py", line 729, in save
    force_update=force_update, update_fields=update_fields)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/base.py", line 759, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/base.py", line 842, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/base.py", line 880, in _do_insert
    using=using, raw=raw)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/query.py", line 1125, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/compiler.py", line 1280, in execute_sql
    for sql, params in self.as_sql():
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/compiler.py", line 1233, in as_sql
    for obj in self.query.objs
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/compiler.py", line 1233, in <listcomp>
    for obj in self.query.objs
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/compiler.py", line 1232, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/compiler.py", line 1172, in prepare_value
    value = field.get_db_prep_save(value, connection=self.connection)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/fields/__init__.py", line 767, in get_db_prep_save
    return self.get_db_prep_value(value, connection=connection, prepared=False)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/fields/__init__.py", line 1431, in get_db_prep_value
    value = self.get_prep_value(value)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/fields/__init__.py", line 1410, in get_prep_value
    value = super().get_prep_value(value)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/fields/__init__.py", line 1271, in get_prep_value
    return self.to_python(value)
  File "/usr/local/lib/python3.5/dist-packages/django/db/models/fields/__init__.py", line 1353, in to_python
    if isinstance(value, datetime.datetime):
TypeError: isinstance() arg 2 must be a type or tuple of types

In my situation. I've got test where datetime is mocked manually. In case test fails, mocking doesn't close correctly. My advice, don't limit scroll buffer of your terminal when running tests and investigate failing tests from the beginning.

for me the solution depended on how I imported it

from datetime import datetime, date
print(isinstance( datetime.fromtimestamp(0), date ))
#returns True

When imported as done above datetime.date would not be recognized here.

import datetime
print(isinstance( datetime.datetime.fromtimestamp(0), datetime.date ))
#returns True

When imported as done above date would not be recognized here.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM