#python-3.x #flask-sqlalchemy
#python-3.x #flask-sqlalchemy
Вопрос:
Итак, у меня есть два файла, которые
# functions.py
#I have a suspicion this 2 way import might be an issue
from models import *
def foo():
return 'bar'
def some_other_unrelated_foo():
users = User.query.all()
return users
и
#models
from functions import *
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(), unique=True)
def name_and_foo(self):
return self.username foo()
Но если я попытаюсь:
print(user_a.name_and_foo())
Я получаю сообщение об ошибке:
NameError: name 'foo' is not defined
Если вместо этого у меня есть один файл:
#models
def foo():
return 'bar'
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(), unique=True)
def name_and_foo(self):
return self.username foo()
Я получаю правильное:
print(user_a.name_and_foo())
result: "user_abar"
Каков правильный способ получения функций из функций.py виден для методов класса в models.py ?
Комментарии:
1. Что произойдет, если вы попытаетесь
from functions import foo
? Кроме того, как это выполняется? Из командной строки в рабочем каталоге?2. Просто предупреждаю, импорт подстановочных знаков, подобный этому
from models import *
, скрывает потенциальные ошибки, которые могут помочь в отладке.
Ответ №1:
Сначала вы должны вызвать функцию.
#models
from functions import *
class User(UserMixin, db.Model):
foo = foo()
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(), unique=True)
def name_and_foo(self):
return self.username foo()
Однако убедитесь, что ваши файлы находятся в одном и том же месте, это также может быть проблемой в данный момент
Комментарии:
1. А ты — нет. ОП упомянул, что это работает, когда функция находится в том же файле. Кроме того, единственный способ, которым это могло бы когда-либо сработать,
foo
— это вернуть функцию или вызываемую функцию. Эта строкаfoo = foo()
устанавливаетfoo
'bar'
значение, а затем эта строкаreturn self.username foo()
вызовет как aNameError
, так и ошибку при попытке вызвать строку.
Ответ №2:
Хорошо, я решил эту проблему вскоре после публикации, я переместил импорт в нижнюю часть обоих файлов друг для друга, и это, кажется, решает проблему. Я не на 100% понимаю, почему это так работает.