Я пытаюсь создать список электронных писем из списка сотрудников (каждый сотрудник в собственном встроенном списке). Это делается путем выбора формата электронного письма, а затем использования цикла for для имени каждого сотрудника. Ниже приведен код. Моя проблема в том, что если я даю пустые строки self.first и self.last, чтобы их можно было вызывать в выборе формата ниже, им не переназначаются фактические имена и фамилии в цикле for, а скорее печатаются электронные письма со своими пустыми строками. Я вижу, что метод получения имени и фамилии работает, но по какой-то причине email = self.email_format не работает должным образом с выводом (или аналогичным выводом):
['@gmail.com', '@gmail.com', '[email protected]']
Как я могу исправить это или изменить порядок данных?
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) [email protected]
2) [email protected]
3) [email protected]
4) [email protected]
5) [email protected]
6) [email protected]
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()
Хотя использование 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) [email protected]
2) [email protected]
3) [email protected]
4) [email protected]
5) [email protected]
6) [email protected]
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
['[email protected]', '[email protected]', '[email protected]']
# 2
['[email protected]', '[email protected]', '[email protected]']
# 3
['[email protected]', '[email protected]', '[email protected]']
# 4
['[email protected]', '[email protected]', '[email protected]']
# 5
['[email protected]', '[email protected]', '[email protected]']
# 6
['[email protected]', '[email protected]', '[email protected]']
Нет необходимости в self.first
или self.last
— достаточно простых параметров области действия.
пожалуйста, используйте общий тег [python] для вопросов все python