Хотя использование 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
- достаточно простых параметров области действия функции.