Python3 генерирует строки в цикле for, переменные класса не переопределяются для каждой итерации - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь сгенерировать список электронных писем из списка сотрудников (каждый сотрудник в своем собственном встроенном списке).Это делается путем выбора формата электронной почты, а затем с помощью цикла for для имени каждого сотрудника.Ниже приведен код.Моя проблема заключается в том, что если я задаю пустые строки для self.first и self.last, чтобы их можно было вызывать в формате, указанном ниже, они не переназначают фактические имена и фамилии в цикле for, а скорее печатают электронные письмас их пустыми строками.Я вижу, что метод получения имени и фамилии работает, но по какой-то причине email = self.email_format не работает должным образом с выводом (или аналогичным выводом):

['@ gmail.com ',' @gmail.com ',' _@gmail.com ']

Как это исправить или переставить данные?

class email_generator():

    def __init__(self):
        self.domain = 'gmail'
        self.generated_emails = []
        self.employees = [['Foo Bar', 'job title'], ['Matthew Gorand', 'job title'], ['Julia Snyder', 'job title']]

    def format_choice(self):
        self.last = ''
        self.first = ''
        choice = input('''
                Choose a format for generating emails:

                1) first.last@domain.com
                2) last.f@domain.com
                3) f.last@domain.com
                4) last_first@domain.com
                5) firstl@domain.com
                6) flast@domain.com
                7) Pass
                ''')

        if choice == '1':
            self.email_format = f'{self.first}.{self.last}@{self.domain}.com'
        elif choice == '2':
            self.email_format = f'{self.last}.{self.first}@{self.domain}.com'
        elif choice == '3':
            self.email_format = f'{self.first[:1]}.{self.last}@{self.domain}.com'
        elif choice == '4':
            self.email_format = f'{self.last}_{self.first}@{self.domain}.com'
        elif choice == '5':
            self.email_format = f'{self.first}.{self.last[:1]}@{self.domain}.com'
        elif choice == '6':
            self.email_format = f'{self.first[:1]}{self.last}@{self.domain}.com'
        elif choice == '7':
            pass
        else:
            print('Invalid Input')
            self.format_choice()

        for employee in self.employees:
            split = employee[0].split(' ')
            self.first = split[0]
            self.last = split[1]
            email = self.email_format
            self.generated_emails.append(email)

        print(self.generated_emails)

test = email_generator()
test.format_choice()

1 Ответ

0 голосов
/ 07 апреля 2019

Хотя использование f-strings хорошо, они немедленно интерполируются и не помогают вам из-за структурирования кода. str.format() однако делает:

class email_generator(): 
    def __init__(self):
        self.domain = 'gmail'
        self.generated_emails = []
        self.employees = [['Foo Bar', 'job title'], ['Matthew Gorand', 'job title'], 
                          ['Julia Snyder', 'job title']]

Выберите, какой формат использовать теперь в своей собственной функции:

    def get_format(self):
        """Loops until a valid choice was made, returns a format string using f,l and d
        as variable names for first,last and domain."""
        while True:
            choice = input('''
    Choose a format for generating emails:

    1) first.last@domain.com
    2) last.f@domain.com
    3) f.last@domain.com
    4) last_first@domain.com
    5) firstl@domain.com
    6) flast@domain.com
    7) Pass
    ''')

            if choice == '1':
                return '{f}.{l}@{d}.com' 
            elif choice == '2':
                return '{l}.{f[0]}@{d}.com' 
            elif choice == '3':
                return '{f[0]}.{l}@{d}.com' 
            elif choice == '4':
                return '{l}_{f}@{d}.com' 
            elif choice == '5':
                return '{f}.{l[0]}@{d}.com' 
            elif choice == '6':
                return '{f[0]}{l}@{d}.com'
            elif choice == '7':
                return None

        print("Invalid.")

Сам форматтер - сокращен, потому что средство выбора строки формата было преобразовано в его собственную функцию:

    def format_choice(self):
        email_format = self.get_format()
        if not email_format:
            return

        for employee in self.employees:
            split = employee[0].split(' ')
            fir = split[0]
            las = split[1]
            dom = self.domain
            # the str.format can use positional or named formatting - I use named
            # this must correlate with the names inside the format string:
            #                   '{f[0]}.{l}@{d}.com'     --> f=fir, l=las, d=dom 
            self.generated_emails.append(email_format.format(f=fir, l=las, d=dom))

        print(self.generated_emails)

test = email_generator() 
test.format_choice() # 6 times for all different formats to get all outputs

Выход:

# 1
['Foo.Bar@gmail.com', 'Matthew.Gorand@gmail.com', 'Julia.Snyder@gmail.com']
# 2
['Bar.F@gmail.com', 'Gorand.M@gmail.com', 'Snyder.J@gmail.com']
# 3
['F.Bar@gmail.com', 'M.Gorand@gmail.com', 'J.Snyder@gmail.com']
# 4
['Bar_Foo@gmail.com', 'Gorand_Matthew@gmail.com', 'Snyder_Julia@gmail.com']
# 5
['Foo.B@gmail.com', 'Matthew.G@gmail.com', 'Julia.S@gmail.com']
# 6
['FBar@gmail.com', 'MGorand@gmail.com', 'JSnyder@gmail.com']

Нет необходимости в self.first или self.last - достаточно простых параметров области действия функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...