Python как вызвать метод из другого модуля внутри метода класса

#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() вызовет как a NameError , так и ошибку при попытке вызвать строку.

Ответ №2:

Хорошо, я решил эту проблему вскоре после публикации, я переместил импорт в нижнюю часть обоих файлов друг для друга, и это, кажется, решает проблему. Я не на 100% понимаю, почему это так работает.