Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 10, 2017 22:10:38

damilkrose
Зарегистрирован: 2017-11-10
Сообщения: 18
Репутация: +  -1  -
Профиль   Отправить e-mail  

Прошу немного критики

Пишу на питоне где-то год. Довольно много всего знаю, но вот всегда код получается какой-то не читаемый и не красивый. На этот раз постарался. Просто вопрос - правильно ли я пишу или нет. Может где-то нарушаются правила PEP-8. Доскажите буду рад.
Код:

 from cryptograph.cryptobomb.ceaser_for_cryptobomb import cipher as cc # У меня есть прога, которая шифрует шифром Цезаря
from cryptograph.cryptobomb.vijiner_cipher_for_cryptobomb import cipher as vc # и прога, шифрующая шифром Вижинера
from random import randrange, choice
class cryptobomb:
    def __init__(self):
        self.nameismain = True if __name__ == "__main__" else False
    def main(self, num_of_times=None, text=None):
        """
        Проверка на то, была ли программа
        запущена пользователем или модулем.
        Если модуль не ввел нужные параметры, сработает ошибка AttributeError
        """
        if self.nameismain:
            try:
                num_of_times = int(input("Number of times of crypting: "))
            except ValueError as v:
                print("There is the error", v)
                print("Due to the error, number\n"
                      "of times of crypting will\n"
                      "set to 10. Nice day!\n")
                num_of_times = 10
            text = str(input("Enter text:"))
        else:
            if not num_of_times or not text:
                raise AttributeError("module need give all parameters to the main function")
            elif not num_of_times and not text:
                raise AttributeError("module need give all parameters to the main function")
            else: pass
        ciphers = [cc, vc]
        encrypted_text = text
        key_log = []
        for t in range(0, num_of_times):  # Начинаем шифровать
            chosen_cipher = choice(ciphers)
            if chosen_cipher == vc:
                crypt_key = ""
                key_for_crypt = [chr(k) for k in range(ord("а"), ord("я") + 1)]
                for g in range(5,15):
                    crypt_key += str(choice(key_for_crypt)) # Шифр Вижинера это шифр, в котором позиция буквы ключа и позиция буквы текста складываются и заменяются буквой в алфавите на позиции которая равна этой сумме 
                key_log.append(crypt_key)
                encrypted_text = chosen_cipher(text=encrypted_text, key=crypt_key, task=True)
            else:
                key_for_crypt = randrange(-26, 26) # TODO: возможно вместо -26, 26 надо -27, 27 из-за пробелов
                key_log.append(key_for_crypt)
                encrypted_text = chosen_cipher(text=encrypted_text, key=key_for_crypt, task=True)
        with open("key_list.txt", "w") as key_list_clear: # очищаем список ключей
            key_list_clear.write("")
            key_list_clear.close()
        with open("key_list.txt", "a") as key_list_append: # добавляем новые ключи
            for key in key_log:
                key_list_append.write(str(key) + '\n')
            key_list_append.close()
        print("Encrypted text: ")
        print(str(encrypted_text).lower())
        print("Number of encrypting times: " + str(num_of_times))
        print("Used cipher:\n"
              "1. Ceaser's cipher\n"
              "2. Vijiner's cipher\n")
        print("Author - Damilkrose")
if __name__ == "__main__":
    cryptobomb().main()
else: pass

Получившийся лист ключей прикреплен(Шифровал слово ‘упси’)

Вывод:
 Encrypted text: 
ожьл
Number of encrypting times: 15
Used cipher:
1. Ceaser's cipher
2. Vijiner's cipher
Author - Damilkrose

Отредактировано damilkrose (Ноя. 10, 2017 22:12:04)

Прикреплённый файлы:
attachment Key_list.txt (124 байта)

Офлайн

#2 Ноя. 10, 2017 22:49:52

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Прошу немного критики

0) Я пока не увидел смысла в создании класса cryptobomb
1) Слишком много print-ов
2) input должен быть вне класса
3) вместо:

 self.nameismain = True if __name__ == "__main__" else False
Нужно:
 self.nameismain = __name__ == "__main__"
4) вместо:
 if self.nameismain:
             ...
else:
         if not num_of_times or not text:
             raise AttributeError("module need give all parameters to the main function")
         elif not num_of_times and not text:
              raise AttributeError("module need give all parameters to the main function")
         else: pass
Нужно:
 if self.nameismain:
             ...
elif not num_of_times or not text:
         raise AttributeError("module need give all parameters to the main function")
elif not num_of_times and not text:
         raise AttributeError("module need give all parameters to the main function")
5) Вместо:
 crypt_key = ""
for g in range(5,15):
          crypt_key += str(choice(key_for_crypt))
Нужно:
 crypt_key = "".join( "".join( choice(k) for k in key_for_crypt ) for g in range(5,15))
Ну и так далее…



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Ноя. 10, 2017 22:54:43)

Офлайн

#3 Ноя. 11, 2017 01:59:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Прошу немного критики

damilkrose
Довольно много всего знаю, но вот всегда код получается какой-то не читаемый и не красивый.
Похоже это всё на Java-хрень. Java-хрень - это хрень, которая написана в стиле Java. На питоне такой стиль не применяется, у него свой собственный стиль. Поэтому программы на питоне выглядят красиво - он разрабатывался таким изначально (приближенным к псевдокоду).

Ты не можешь просто взять, выучить PEP8 и после этого писать красивый код, потому что PEP8 - это лишь малый процент того, что нужно знать. PEP8 знать необходимо, так что и пропустить ты его тоже не можешь.

В целом у тебя наблюдается проблема с самими алгоритмами. Ты не можешь продумать алгоритм, расцепить его на части, на винтики, а потом эти винтики вкручивать в один алгоритм, в другой алгоритм, в третий алгоритм. В чём это выражается? Вот, например, у тебя там есть фрагмент, где из консоли запрашивается “Number of times of crypting:”. А как можно вытащить этот блок и запросить данные не из консоли, а из почтового сообщения? Человек при запуске указал ключ “хочу взять это число из почты” или “хочу взять это число из сокета” или “хочу взять это число из такого-то файла”, как ты можешь предоставить ему такую возможность? Ведь это важно, потому что человек может быть сисадмином, который добавляет вызов твоей программы из своего скрипта, и у него просто не будет возможности сидеть за компом и вводить эти данные вручную, он скрипт настроит в организации и пойдёт дальше гулять, а скрипт будет работать годами. Вот такая заковычка, она у тебя тут во всём. Ты выводишь на экран, а это надо где-то на экране, а где-то в логе, а где-то оно по сети должно пойти на сервер, где стоит обработчик этих данных и вообще база данных. Поэтому у тебя всё должно быть разделено, должны быть винтики: “консольный читатель”, “консольный писатель”, “вычислитель шифра”, “в файл сохранятель”, “из файла братель” и так далее. И каждый винтик структурно из себя что представляет? Да то же самое - тоже набор винтиков, подключенных в одно пространство операций. Винтики сделаны из винтиков, сделанных из винтиков, сделанных из винтиков. Чтобы это уметь делать с любой программой, надо применять метод разработки “сверху вниз”, метод декомпозиции алгоритма, интерфейсы.
wiki. метод “сверху вниз”
wiki. декомпозиция

tags: algorithm decomposition



Отредактировано py.user.next (Ноя. 11, 2017 02:03:16)

Офлайн

#4 Ноя. 11, 2017 07:39:58

damilkrose
Зарегистрирован: 2017-11-10
Сообщения: 18
Репутация: +  -1  -
Профиль   Отправить e-mail  

Прошу немного критики

py.user.next
моя программа будет встроена в Телеграм бот. И доступ к числу, выводу и всех кишков программы будет выводиться пользователю. К счастью, я это продумал.
А насчет того, как взять из файла всю инфу - меня ведется лог.
А так то спасибо всем за замечания. Следующий раз - учту.

Отредактировано damilkrose (Ноя. 11, 2017 07:42:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version