Я просто наткнулся на интересный (?) способ скрыть пароли (и другие персональные данные) от общего вывода с экрана на лог файлы.
В своей книге Как ошибаться в Python Майк Пирнат предлагает реализовать класс для чувствительных строк и перегрузить его __str__
- и __repr__
-методы.
Я экспериментировал с этим и получил это:
class secret(str):
def __init__(self, s):
self.string = s
def __repr__(self):
return "'" + "R"*len(self.string) + "'"
def __str__(self):
return "S" * len(self.string)
def __add__(self, other):
return str.__add__(self.__str__(), other)
def __radd__(self, other):
return str.__add__(other, self.__str__())
def __getslice__(self, i, j):
return ("X"*len(self.string))[i:j]
(Я знаю, что использование len
предоставляет информацию о скрытом содержимом. Это просто для тестирования.)
В этом случае он отлично работает:
pwd = secret("nothidden")
print("The passwort is " + pwd) # The passwort is SSSSSSSSS
print(pwd + " is the passwort.") # SSSSSSSSS is the password.
print("The passwort is {}.".format(pwd)) # The password is SSSSSSSSS.
print(["The", "passwort", "is", pwd]) # ['The', 'password', 'is', 'RRRRRRRRR']
print(pwd[:]) # XXXXXXXXX
Однако это не работает:
print(" ".join(["The", "password", "is", pwd])) # The password is nothidden
Итак, как str.join() работает внутри? Какой метод мне придется перегружать, чтобы затенять строку?