Я работаю над кодом для определенной базы данных. Я хочу создать некоторые функции, которые облегчат запись в БД и получение оттуда. Во всяком случае - я хочу сделать некоторые функции.
Моей первой мыслью было просто открыть новый файл .py, добавить туда все функции, а затем использовать:
from FileName import Function
а затем использовать его, и он работает. Но это не так хорошо, если у меня много функций, потому что мне нужно будет импортировать каждую функцию, которую я хочу, вручную:
from FileName import Function1
from FileName import Function2
from FileName import Function3
Напротив, когда я использую import random, я могу просто использовать random.func в самом коде и продолжать.
Друг предложил создать класс. Я не думал об этом, так как я не пытаюсь создать объект. Так, например, в моем текущем коде класса:
import sqlite3
conn = sqlite3.connect('asfan.db')
c = conn.cursor()
class Manager:
def save_chunk():
c.execute("INSERT INTO DATA_CHUNKS VALUES(234, 'hello', '20190617', 'article')")
conn.commit()
c.close()
conn.close()
а внутри основного я просто звоню import Manager from File и все работает нормально. Но PyCharm не очень нравится функция, которую я написал, потому что метод не имеет первого параметра (PyCharm предлагает «Self») и является статическим.
Так это правильный способ «хранить» функции? Я хотел бы некоторую помощь и ссылки, чтобы узнать о том, что я ищу.






Я бы не рекомендовал использовать класс исключительно для хранения функций. Вам нужно либо создать его экземпляр для вызова функций (при этом сам экземпляр не имеет значения), либо сделать каждую функцию статический метод или метод класса, что также не является хорошей практикой.
Как правило, для импорта функций вы можете сделать это в одной строке.
from module_name import fn_one, fn_two, fn_three
Помимо множества действительно хороших стандартов, касающихся именования и импорта, я настоятельно рекомендую прочитать и принять ПКП 8.
Я не знаю, предполагалось ли, что этот «код класса» будет содержимым одного файла, но вы должны быть осторожны при открытии и закрытии ресурсов в разных контекстах; если кто-то импортирует этот файл, соединение с базой данных будет открыто, но оно не будет закрыто, пока не будет вызван save_chunk (и тогда соединение больше не будет доступно).
В этом конкретном случае класс может иметь смысл, если вы пойдете немного дальше и будете использовать его для управления подключением к базе данных. менеджер контекста — это распространенный и полезный способ управления настройкой и отключением для таких вещей, как подключения к базе данных.
Это уже часть Python для SQLite, поэтому вы можете создать подкласс sqlite.Connection, если хотите использовать преимущества его менеджера контекста и добавить служебные функции.
from sqlite3 import Connection
class SQLiteConnection(Connection):
def test_schema(self):
self.execute('CREATE TABLE test (name, location);')
def test_populate(self):
self.execute('''
INSERT INTO test
VALUES ('kungphu', 'Tokyo'),
('Argento', 'Jerusalem')
''')
def test_select(self):
return self.execute('SELECT * from test')
Пример использования:
>>> from scm import SQLiteConnection
>>>
>>> with SQLiteConnection(':memory:') as conn:
... conn.test_schema()
... conn.test_populate()
... for row in conn.test_select():
... print(row)
...
('kungphu', 'Tokyo')
('Argento', 'Jerusalem')
Методы, которые я здесь добавил, довольно глупы и определенно не являются хорошим способом работы с фикстурами или тестированием. Они просто иллюстрируют, как вы можете это сделать, если это имеет смысл в вашем случае использования.
Эй, чувак, лучше поздно, чем никогда. Спасибо за помощь! Кажется, я забыл ответить тогда.
@Ардженто Ха-ха, пожалуйста. Взрыв из прошлого!
Вы можете сделать то же самое с вашим модулем.
import FileName, тогда пишиFileName.Function1.