ActiveState có một công thức mang tên Constants in Python bởi đáng kính Alex Martelli để tạo một module const
với các thuộc tính mà không thể được phục hồi sau khi tạo. Điều đó nghe có vẻ giống như những gì bạn đang tìm kiếm ngoại trừ việc tăng lên — nhưng điều đó có thể được thêm bằng cách làm cho nó kiểm tra xem liệu tên thuộc tính có phải là chữ hoa hay không.
Tất nhiên, điều này có thể bị phá vỡ bởi xác định, nhưng đó là cách Python là — và được coi là "điều tốt" của hầu hết mọi người. Tuy nhiên, để làm cho nó khó khăn hơn một chút, tôi khuyên bạn không nên thêm phương thức __delattr__
được cho là rõ ràng vì mọi người có thể chỉ xóa tên và sau đó thêm chúng trở lại các giá trị khác nhau.
Đây là những gì tôi đang tham gia về:
# Put in const.py...
# from http://code.activestate.com/recipes/65207-constants-in-python
class _const:
class ConstError(TypeError): pass # base exception class
class ConstCaseError(ConstError): pass
def __setattr__(self, name, value):
if name in self.__dict__:
raise self.ConstError("Can't change const.%s" % name)
if not name.isupper():
raise self.ConstCaseError('const name %r is not all uppercase' % name)
self.__dict__[name] = value
# replace module entry in sys.modules[__name__] with instance of _const
# (and create additional reference to module so it's not deleted --
# see Stack Overflow question: http://bit.ly/ff94g6)
import sys
_ref, sys.modules[__name__] = sys.modules[__name__], _const()
if __name__ == '__main__':
import const # test this module...
try:
const.Answer = 42 # not OK, mixed-case attribute name
except const.ConstCaseError as exc:
print(exc)
else: # test failed - no ConstCaseError exception generated
raise RuntimeError("Mixed-case const names should't have been allowed!")
const.ANSWER = 42 # should be OK, all uppercase
try:
const.ANSWER = 17 # not OK, attempts to change defined constant
except const.ConstError as exc:
print(exc)
else: # test failed - no ConstError exception generated
raise RuntimeError("Shouldn't have been able to change const attribute!")
Output:
const name 'Answer' is not all uppercase
Can't change const.ANSWER
Tại sao các bạn dành thời gian về vấn đề này? Mọi người có nguồn Python của bạn. Họ chỉ có thể thay đổi nó. Tại sao lộn xộn xung quanh với "cuối cùng" và "liên tục"? –
Bạn biết đấy, đó là mục đích. Các chàng trai Python có ý kiến, rằng chúng ta đều là người lớn và nên hành động như những người thân. Vậy tại sao lại cấm truy cập? Hành động như một người lớn và không bao giờ thay đổi chúng trong mã của bạn. Nếu một lập trình viên khác làm, đó là lỗi của anh ta, nếu mã bị phá vỡ, và bạn có một VCS để tìm ra ai để đổ lỗi (tôi giả định). – Boldewyn
Hơn nữa, đó là một điều dễ dàng để kiểm toán. Bất kỳ trường hợp nào của 'UPPER_CASE =' là một lỗi vì ai đó đã phá vỡ các quy tắc. –