1

Тема: Прокритикуйте код[wxPython]

Доброго дня!
Написав генератор паролів на wxPython. Програма як і алгоритм проста і невеличка, але це перша моя программа в wxPython, яка в деякій мірі практична. Тому прошу оцінити стиль, алгортм. Буду вдячний за об'єктивну критику.  :)

Головний модуль
# _*_ coding: utf-8 _*_

import wx
import gen

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, u"Генератор паролів", pos=(100,100), size=(690,500))
        # panel
        self.panel = wx.Panel(self, -1)
        self.panel.SetBackgroundColour("white")
        # check_boxs
        self.check_box1 = wx.CheckBox(self.panel, -1, "A-Z", pos=(20,20),
                                      size=(100,20))
        self.check_box2 = wx.CheckBox(self.panel, -1, "a-z", pos=(20,50),
                                      size=(100,20))
        self.check_box3 = wx.CheckBox(self.panel, -1, "0-9", pos=(20,80),
                                      size=(100,20))
        self.check_box4 = wx.CheckBox(self.panel, -1,
                                      u"Знаки правопису та інші (!, ;, %, ?, *, ...)",
                                      pos=(20,110), size=(250,20))
        self.check_box1.SetValue(True)
        self.check_box2.SetValue(True)
        self.check_box3.SetValue(True)
        self.check_box4.SetValue(True)
        # SpinCtrls
        self.sc1 = wx.SpinCtrl(self.panel, -1, value="", pos=(200, 140), size=(80, -1),
                          min=1, max=100, initial=8)
        self.sc2 = wx.SpinCtrl(self.panel, -1, value="", pos=(200, 170), size=(80, -1),
                          min=1, max=20, initial=10)
        # Labels
        self.label1 = wx.StaticText(self.panel, -1, u"Кількість символів: ",
                               pos=(20, 140), size=(150, -1))
        self.label2 = wx.StaticText(self.panel, -1, u"Кількість паролів: ",
                               pos=(20, 170), size=(150, -1))
        # TextCtrl
        self.output_field = wx.TextCtrl(self.panel, -1, "",
                                        pos=(310, 20), size=(330, 400),
                                        style=wx.TE_MULTILINE)
        self.output_field.SetInsertionPoint(0)
        # button
        self.button_ok = wx.Button(self.panel, id=-1, label="OK",
                                   pos=(20, 200), size=(260, 220),
                                   style=wx.ID_OK)
        # Binders
        self.Bind(wx.EVT_BUTTON, self.OnClickOk, self.button_ok)

    def OnClickOk(self, event):
        up_az = self.check_box1.GetValue()
        low_az = self.check_box2.GetValue()
        digitals = self.check_box3.GetValue()
        ot_chars = self.check_box4.GetValue()
        
        c_char = self.sc1.GetValue()
        c_pass = self.sc2.GetValue()
        # отримуємо список згенерованих паролей ф-цією gen.gen
        pass_list = gen.gen(up_az, low_az, digitals, ot_chars, c_char, c_pass)
        self.output_field.Clear()
        # умова, котра змінює розміри фрейма та поля виводу паролю,
        # в залежності від кількості символів в паролі
        if c_char>35:
            temp_w = 380+(c_char-35)*7
            self.output_field.SetSize((temp_w, 400))
            self.SetSize((temp_w+410, 500))
        else:
            self.output_field.SetSize((330, 400))
            self.SetSize((690,500))
        # вивід паролей
        for password in pass_list:
            self.output_field.AppendText(password+"\n")

class MyApp(wx.App):
    def OnInit(self):
        self.main_frame = Frame()
        self.SetTopWindow(self.main_frame)
        self.main_frame.Show()
        return True

if __name__=="__main__":
    app = MyApp()
    app.MainLoop()
Додатковий модуль
# _*_ coding: utf-8 _*_

u""" Модуль містить ф-нкцію генерації паролей з латинських\n
символів, цифр та знаків правопису та інших."""

import random
import string

def gen(up_az, low_az, digit, chars, c_ch, c_pass):
    gen_string = ""
    res_list = []
    if up_az:
        gen_string += string.ascii_uppercase*3
    if low_az:
        gen_string += string.ascii_lowercase*3
    if digit:
        gen_string += string.digits
    if chars:
        gen_string += string.punctuation
    for i in range(0, c_pass):
        temp = ""
        for j in range(0, c_ch):
            temp += random.choice(gen_string)
        res_list.append(temp)
    return res_list    

2

Re: Прокритикуйте код[wxPython]

а це цікаво: код-рев'ю від ґпт4

GPT-4 написав:

У вас досить хороший початковий код. Мені сподобалося, як ви структурували свою програму, розділивши її на два модулі. Однак, я маю кілька рекомендацій щодо покращення якості коду та дотримання стилю PEP8.

Замініть коментарі стилю кодування на наступні рядки:

# -*- coding: utf-8 -*-

Використовуйте f-стрічки замість конкатенації для виводу паролів:

self.output_field.AppendText(f"{password}\n")

Замість кількарядкових коментарів у додатковому модулі використовуйте докстрінги:

def gen(up_az, low_az, digit, chars, c_ch, c_pass):
    """
    Функція генерує паролі з латинських символів, цифр та знаків правопису та інших.
    """

Замість ітерації за допомогою індексів у генерації паролів, використовуйте list comprehension:

res_list = [''.join(random.choice(gen_string) for _ in range(c_ch)) for _ in range(c_pass)]

Розгляньте перейменування змінних на більш зрозумілі назви, наприклад c_ch на num_chars, c_pass на num_pass.
З урахуванням цих змін, ваш код виглядатиме наступним чином:

Головний модуль:

# -*- coding: utf-8 -*-

import wx
import gen

class Frame(wx.Frame):
    # (Код класу Frame залишається без змін)

class MyApp(wx.App):
    def OnInit(self):
        self.main_frame = Frame()
        self.SetTopWindow(self.main_frame)
        self.main_frame.Show()
        return True

if __name__=="__main__":
    app = MyApp()
    app.MainLoop()

Додатковий модуль:

# -*- coding: utf-8 -*-

"""
Модуль містить функцію генерації паролей з латинських
символів, цифр та знаків правопису та інших.
"""

import random
import string

def gen(up_az, low_az, digit, chars, num_chars, num_pass):
    """
    Функція генерує паролі з латинських символів, цифр та знаків правопису та інших.
    """
    gen_string = ""
    
    if up_az:
        gen_string += string.ascii_uppercase * 3
    if low_az:
        gen_string += string.ascii_lowercase * 3
    if digit:
        gen_string += string.digits
    if chars:
        gen_string += string.punctuation
    
    res_list = [''.join(random.choice(gen_string) for _ in range(num_chars)) for _ in range(num_pass)]
    
    return res_list

У вашому додатковому модулі коду загалом добрий. Як я вже зазначив раніше, я маю кілька рекомендацій щодо покращення:

Використовуйте докстрінги замість кількарядкових коментарів.
Використовуйте list comprehension замість вкладених циклів для генерування паролів.
Перейменуйте змінні c_ch та c_pass на num_chars та num_pass відповідно для кращої зрозумілості.
З урахуванням цих змін, ваш додатковий модуль виглядатиме так, як показано вище.

Загалом, ваш код добре структурований, але дотримання PEP8 та використання спискових включень може зробити ваш код ще кращим. Надіюсь, що ці рекомендації виявляться корисними для вас. Успіхів у вашому навчанні та розвитку!

3

Re: Прокритикуйте код[wxPython]

Узагалі кодування треба було вказувати в Python 2; у Python 3 усталене кодування - utf-8, його не треба вказувати.

Змінні з цифрами - ознака смердячого коду. Якщо у вас є поля check_box1, check_box2 і т.д. - то або об'єднайте їх у масив check_boxes[], або дайте їм власні назви на кшталт cb_up_az, cb_low_az і т.д.

Нерівномірність у символах знижує надійність паролів. Якщо вже генеруєте надійний пароль, то робіть це надійно. Не кажу вже про неприпустимість використання звичайного ГПВЧ для цього.

Ну і ви трохи неправильно сприймаєте власний код. Основний модуль - той, де зберігається, власне, логіка застосунку; а той, де ви форми створюєте - це додатковий модуль для GUI.

Подякували: Tarpan87, leofun012

4

Re: Прокритикуйте код[wxPython]

...от тільки темі 8 років, автор вже міг пережити кризу середнього віку і перемкнутися на розведення свиней

5 Востаннє редагувалося Firefox is dead (10.04.2023 12:09:31)

Re: Прокритикуйте код[wxPython]

Тут щось було, а можливо і не було, але зараз тут нічого немає