@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()
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
@vabka
Токсичный
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 и дублирование кода
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
HemulGM
@HemulGM
Delphi Developer, сис. админ
Тут нет ни сложных запросов, ни сложной интересной логики. Сплошные примитивные команды.
Ни удобства ввода (GUI), ни проверок на ввод данных (вместо номера телефона ты можешь ввести что угодно).
Даже проверок на ошибки отсутствуют cursor.fetchall()[0][0].
Не знаю, на что тут смотреть.
Ответ написан
@mkone112
Начинающий питонист.
Зачем ты задаешь такой вопрос, если учишь питон пару недель?
  • Ветвления заменить на словари(можно с лямбдами)
  • Убрать миллион принтов
  • Почему бы не использовать ORM?
  • Код-стайл отсутствует
  • Почему не Pathlib?
  • chmod нужен?
  • Нет выхода из While
  • ...
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы