Tôi vừa vấp vào một cách thú vị (?) Để ẩn mật khẩu (và các dữ liệu cá nhân khác) từ đầu ra chung từ màn hình sang logfiles.Nội bộ của Pythons str.join() là gì? (Ẩn mật khẩu từ đầu ra)
Trong cuốn sách How to make mistakes in Python Mike Pirnat gợi ý triển khai lớp học cho các chuỗi nhạy cảm và quá tải __str__
- và __repr__
-methods của chúng tôi.
tôi đã thử nghiệm với điều đó và nhận điều này: (. Tôi biết rằng việc sử dụng len
cung cấp thông tin về nội dung để ẩn Nó chỉ là để thử nghiệm.)
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]
Nó hoạt động tốt trong trường hợp này:
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
Tuy nhiên điều này không hoạt động:
print(" ".join(["The", "password", "is", pwd])) # The password is nothidden
Vì vậy, str.join() hoạt động như thế nào? Phương pháp nào tôi sẽ phải quá tải để che khuất chuỗi?
Loại tác phẩm này. 'print (" ".join ([" The "," password "," is ", pwd]))' sẽ tạo ra một traceback, nhưng gói 'pwd' trong' str() 'sẽ tạo ra kết quả mong muốn. Tất nhiên, điều đó cũng sẽ sửa chữa phiên bản gốc. Tôi đoán đây là một chút an toàn hơn, sản xuất một traceback thay vì in chuỗi ẩn. – TigerhawkT3
@ TigerhawkT3 Tôi đã cung cấp triển khai hoạt động như bạn mong đợi và thêm ghi chú về lý do tại sao điều này không thực sự hữu ích ... nếu bạn không muốn hiển thị nội dung nào đó, tôi sẽ không * triển khai một số phương pháp hoặc tăng ngoại lệ khi chúng được gọi. – Bakuriu
Nó không phải là nhiều về lập trình * lỗi * nhưng về tiện lợi khi, nói, đăng nhập một truy vấn REST hoặc tương tự, vì vậy bạn không phải che khuất nó cho mình mọi lúc. Và đối với phần quan trọng nhất đó là sự tò mò. Nhưng có lẽ bạn đang đúng, có những cách tốt hơn để tránh in dữ liệu hợp lý. –