Описание класса, принимающего явные аргументы

Рейтинг: 0Ответов: 1Опубликовано: 26.01.2023

Есть код, который генерирует пароль по заданной длине

class PasswordGenerator:
    def Generate(password_length):
        password = ''
        for i in range (int(password_length)):
            rand_matrix_row = random.randint(0, 3)
            password = password + matrix[rand_matrix_row][random.randint(0, len(matrix[rand_matrix_row]))-1]
        return(password)

Как можно сделать так, чтобы при вызове Generate функция принимала только явные значения типа int?

То есть, например, когда я вызываю random.randint(), интерпретатор мне сообщает, какие значения принимает randint() и их тип: (a: int, b: int) -> int

Сейчас интерпретатор при вызове сообщает мне следующее:
(password_length: PasswordGenerator) -> str

Ответы

▲ 0

Как можно сделать так, чтобы при вызове Generate функция принимала только явные значения типа int?

То есть, например, когда я вызываю random.randint(), интерпретатор мне сообщает, какие значения принимает randint() и их тип: (a: int, b: int) -> int

Сейчас интерпретатор при вызове сообщает мне следующее:
(password_length: PasswordGenerator) -> str

Интерпретатор сам никак типы не показывает (и не проверяет), скорее всего это IDE выводит типы метода и отображает их.

(password_length: PasswordGenerator) показывает из-за того, что у обычных методов первым аргументом должен идти self, через который в метод передается сам объект при вызове метода от объекта, соответсвенно у первого аргумента тип - такой же как сам класс, в котором находится метод. Чтобы тип аргумента определялся правильно, нужно объявить метод статическим (добавив декоратор @staticmethod):

class PasswordGenerator:
    @staticmethod
    def Generate(password_length):
        password = ''
        for i in range (int(password_length)):
            rand_matrix_row = random.randint(0, 3)
            password = password + matrix[rand_matrix_row][random.randint(0, len(matrix[rand_matrix_row]))-1]
        return(password)

Статический метод - это метод, который вообще никак не зависит от состояния объекта или класса, по сути - просто отдельная функция, которую решили поместить внутрь класса. В данном случае у вас именно такой метод. Но если бы, например, переменная matrix была не глобальной, а полем объекта, то пришлось бы ваш метод сделать обычным, добавить параметр self, и обращаться к matrix через self.matrix.

Чтобы явно указать типы аргументов и возвращаемого значения функции, нужно использовать аннотации:

class PasswordGenerator:
    @staticmethod
    def Generate(password_length: int) -> str:
        password = ''
        for i in range (int(password_length)):
            rand_matrix_row = random.randint(0, 3)
            password = password + matrix[rand_matrix_row][random.randint(0, len(matrix[rand_matrix_row]))-1]
        return(password)

В любом случае, выведенный автоматически или указанный через аннотации тип никак сам по себе интерпретатором при работе программы не проверяется. Он может проверяться внешними инструментами, например IDE или линтерами, такими как mypy.