2015-10-21 3 views
1

У меня возникла странная ошибка запуска приложения и задавалась вопросом, может ли кто-нибудь узнать, как отлаживать/разрешать ее.python 3 import TypeError error

Я бегу приложение Flask с помощью Python 3. Я пнуть вещи, запустив: python manage.py runserver и ниже StackTrace генерируется:

Traceback (most recent call last): 
    File "/projectbase/manage.py", line 19, in <module> 
    create_tables() 
    File "/projectbase/myproject/__init__.py", line 15, in create_tables 
    from myproject.models.util import Weekday, weekday_type 
    File "<frozen importlib._bootstrap>", line 2237, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked 
    File "<frozen importlib._bootstrap>", line 742, in __exit__ 
    File "<frozen importlib._bootstrap>", line 742, in <genexpr> 
TypeError: an integer is required (got type NoneType) 

Проблема заключается в том, когда я запускаю его в отладчике и установить точки останова, проблема уходит. Но если я запустил его без отладки, проблема существует.

Для дальнейшей ссылки функция create_tables() вызывается manage.py код/​​файл выглядит следующим образом:

from myproject.app import app 
from myproject.app import db 

def create_tables(): 
    from myproject.models.util import Weekday, weekday_type 
    from myproject.models.activity import Activity, activities_tags, Occurrence, Tag 

    db.create_all() 

И далее Weekday и weekday_type код в вопросе выглядит следующим образом:

from myproject.app import db 
from myproject.models.enum import DeclEnum 

class Weekday(DeclEnum): 
    Sunday = 'Sunday', {'offset': 0} 
    Monday = 'Monday', {'offset': 1} 
    Tuesday = 'Tuesday', {'offset': 2} 
    Wednesday = 'Wednesday', {'offset': 3} 
    Thursday = 'Thursday', {'offset': 4} 
    Friday = 'Friday', {'offset': 5} 
    Saturday = 'Saturday', {'offset': 6} 

weekday_type = Weekday.db_type(metadata=db.metadata) 
weekday_type.register_with_psycopg(db.engine) 

DeclEnum тип I используется, в основном, просто скопирован с этого gist.

Единственная настройка, которую я сделал для кода, заключалась в том, чтобы сделать DeclEnum немного более гибким, чтобы он мог принимать словарь значений, а не только value и description. Помимо этого я ничего не изменил.

Любые идеи, что здесь происходит? Поскольку акт отладки исправляет ошибки, я не знаю, как это сделать, чтобы понять суть проблемы.

Заранее спасибо.

ответ

0

Ошибка обман.

Глядя на gist я связан в оригинальном вопросе

Метод register_with_psycopg() работает только если тип перечисления сначала был создан в базе данных. Я вызывал метод до того, как тип был создан. Изменяя порядок вещей во время запуска приложения, ошибка исчезла.