Глобальные имена являются частью текущего пространства имен модуля . Функции живут в пространстве имен их модулей, а не где-либо еще. В противном случае импортированная функция не сможет получить доступ к чему-либо, что было импортировано в тот же модуль, в котором они определены, или их поведение полностью изменится в зависимости от того, куда они были импортированы.
Так что нет, глобальная переменная c
в одном модуле не будет видна функции, импортированной из другого модуля.
Гораздо лучший способ инкапсулировать функциональность базы данных - использовать класс для группировки методов и состояния (соединение с базой данных, любые курсоры, которые вы повторно используете между методами и т. Д.). Когда вы затем создаете экземпляр для базы данных, все методы могут получить доступ к self
и найти важные значения прямо здесь, без вызова кода, который должен знать, как это происходит:
class SomeClassName:
def __init__(self, filename):
self.connection = sqlite3.connect(filename)
def some_method(self):
with self.connection:
cursor = self.connection.cursor()
cursor.exeucte('SELECT some, column FROM some_table')
for row in cursor:
some_data_processing(row)
return some_result
и в коде, который должен использовать результаты, все, что вам нужно, это
some_variable = SomeClassName('....')
result = some_variable.some_method()
В качестве примечания: лучше создать новый курсор для каждого запроса. Курсор - это дескриптор для данного запроса и результатов, которые он производит. Хотя повторное использование курсора хорошо, если выполняется последовательно, если сначала вы используете курсор для выбора некоторых строк, а затем извлекаете несколько (но не все ) из этих строк, а затем используете курсор для второго запроса строки первого запроса теперь исчезнут. Это может легко привести к путанице и ошибкам в вашем коде.