Задать вопрос
@piffo

Скрипт на критику?

Совсем новичок в Python. Решил написать свою первую более-менее рабочую программу - контактную книгу. Хотел бы, чтобы более опытные программисты покритиковали/оценили данную программу.
Программа
import os
import stat
import sqlite3

file_exis = os.path.exists("Контакты.txt")
database_exis = os.path.exists("contact_book.db")
conn = sqlite3.connect("contact_book.db")
cursor = conn.cursor()

if file_exis:
    os.chmod("Контакты.txt", stat.S_IWUSR)
if not database_exis:
    cursor.execute("""CREATE TABLE contacts
                      (name text, phone_number text)""")

f = open("Контакты.txt", "a+")

def viewByName():
    name = input("Введите имя контакта >>>")
    sql = "SELECT * FROM contacts WHERE name=?"
    cursor.execute(sql, [name])
    print(cursor.fetchall())

def viewByNum():
    number = input("Введите номер контакта >>>")
    sql = "SELECT * FROM contacts WHERE phone_number=?"
    cursor.execute(sql, [number])
    print(cursor.fetchall())

def num():
    cursor.execute("select count(*) from contacts")
    var = cursor.fetchall()[0][0]
    print(var)

def change():
    name = input("Введите имя контакта >>>")
    print("Введите 'name', чтобы изменить имя контакта")
    print("Введите 'number', чтобы изменить номер контакта")
    var = input(">>>")
    if var == "name":
        var1 = input("Введите новое имя контакта >>>")
        cursor.execute("UPDATE contacts SET name = '{0}' WHERE name = '{1}'".format(var1, name))
        print("Контакт успешно изменён")
    elif var = input("Введите новый номер контакта >>>")
        var1 = input("Введите новый номер контакта >>>")
        cursor.execute("UPDATE contacts SET phone_number = '{0}' WHERE name = '{1}'".format(var1, name))
        print("Контакт успешно изменён")
    else:
        print("Ошибка. Несуществующая команда")
    conn.commit()

def delete():
    name = input("Введите имя(название) контакта >>>")
    sql = "DELETE FROM contacts WHERE name = '{0}'".format(name)
    cursor.execute(sql)
    conn.commit()
    print("Контакт успешно удалён")

def add():
    name = input("Введите имя(название) контакта >>>")
    number = input("Введите номер контакта >>>")
    cursor.execute("""INSERT INTO contacts
                      VALUES (?, ?)""", [name, number])
    conn.commit()
    print("Контакт успешно добавлен")

def command_check():
    if command == "viewByName":
        viewByName()
        print()
    elif command == "viewByNum":
        viewByNum()
        print()
    elif command == "add":
        add()
        print()
    elif command == "change":
        change()
        print()
    elif command == "delete":
        delete()
        print()
    elif command == "num":
        num()
        print()
    elif command == "exit":
        os.chmod("Контакты.txt", stat.S_IREAD)
        f.close()
        print("Выход из программы")
        exit()
    else:
        print("Ошибка. Несуществующая команда")

print("Список команд")
print("viewByName - для просмотра контакта(по имени) \n"
      "viewByNum - для просмотра контакта(по номеру) \n"
      "add - для добавления контакта \n"
      "change - для изменения контакта \n"
      "delete - для удаления контакта \n"
      "num - количество контактов в книге \n"
      "exit - для выхода из программы")
print()

while True:
    command = input("Введите команду >>>")
    command_check()
  • Вопрос задан
  • 183 просмотра
Подписаться 1 Средний 7 комментариев
Решения вопроса 1
1. file_exis - плохое именование (не буду повторяться)
2. "Контакты.txt" - Хардкод
3. os.chmod - не ясно, зачем.
4.
if not database_exis:
    cursor.execute("""CREATE TABLE contacts
                      (name text, phone_number text)""")

Не ясно что этот код должно делать (стоит вынести в функцию) и есть ощущение, что его не тестировали, тк database_exis проверяет наличие файла, а не БД в файле.
5. viewByName - неоднородный кодстайл. если пишешь в stake-case, то пиши и название функций в snake_case и наоборот.
6. command_check - плохое название функции. Подобные функции должны ничанаться с глагола
7.
if command == "viewByName":
        viewByName()
        print()
    elif command == "viewByNum":

- Дублирование кода, хардкод, нарушение SRP. Имеет смысл сделать словарь. и декомпозировать функцию на несколько.
8.
print("viewByName - для просмотра контакта(по имени) \n"
      "viewByNum - для просмотра контакта(по номеру) \n"
      "add - для добавления контакта \n"
      "change - для изменения контакта \n"
      "delete - для удаления контакта \n"
      "num - количество контактов в книге \n"
      "exit - для выхода из программы")

А вот и второй дубль
Из-за \n скрипт не кроссплатформенный. Лучше использовать платформозависимый перенос строки.
9. print() ради переноса строки мне не нравится, но возможно в питоне так принято, так что не буду сильно придираться.
10. viewByName(): и другие.
Нарушение SRP и дублирование кода
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@mkone112
Начинающий питонист.
Зачем ты задаешь такой вопрос, если учишь питон пару недель?
  • Ветвления заменить на словари(можно с лямбдами)
  • Убрать миллион принтов
  • Почему бы не использовать ORM?
  • Код-стайл отсутствует
  • Почему не Pathlib?
  • chmod нужен?
  • Нет выхода из While
  • ...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы