2011-08-16 23 views
11

Tôi đang viết một ứng dụng cần tìm ra lược đồ của cơ sở dữ liệu, trên các công cụ. Để kết thúc, tôi đang viết một bộ điều hợp cơ sở dữ liệu nhỏ bằng cách sử dụng Python. Trước tiên tôi đã quyết định viết một lớp cơ sở trình bày chức năng tôi cần, và sau đó thực hiện nó bằng cách sử dụng các lớp kế thừa từ cơ sở này. Trên đường đi, tôi cần phải thực hiện một số hằng số cần truy cập trên tất cả các lớp này. Một số các hằng số này cần phải được kết hợp bằng cách sử dụng kiểu C bitwise OR.Các quy ước về việc tạo các hằng số trong Python

Câu hỏi của tôi là,

  1. cách tiêu chuẩn chia sẻ hằng như vậy là gì?
  2. cách đúng để tạo các hằng số có thể được kết hợp là gì? Tôi đang đề cập đến mã kiểu dáng MAP_FIXED | MAP_FILE | MAP_SHARED mà C cho phép.

Trước đây, tôi đã xem các chủ đề mà tất cả các hằng số được đưa vào mô-đun trước tiên. Đối với sau này, tôi một thời gian ngắn nghĩ đến việc sử dụng một dict của booleans. Cả hai dường như quá khó sử dụng. Tôi tưởng tượng rằng đây là một yêu cầu khá phổ biến, và nghĩ rằng một số cách tốt phải thực sự tồn tại!

Trả lời

3

Bạn thường tìm thấy các hằng số ở cấp độ toàn cầu và chúng là một trong số ít biến tồn tại ở đó. Cũng có những người viết các không gian tên không đổi bằng cách sử dụng các tên ma sát hoặc đối tượng như thế này

class Const: 
    x = 33 

Const.x 

Có một số người đặt chúng vào mô-đun và những người khác đính kèm chúng dưới dạng biến lớp truy cập. Phần lớn thời gian là sở thích cá nhân của nó, nhưng chỉ một vài biến toàn cục không thể làm tổn thương nhiều đến thế.

14

cách tiêu chuẩn để chia sẻ các hằng số như vậy là gì?

suốt các thư viện chuẩn, cách phổ biến nhất là xác định các hằng số như biến mô-đun cấp sử dụng tên UPPER_CASE_WITH_UNDERSCORES.

cách đúng để tạo các hằng số có thể được kết hợp là gì? Tôi đang đề cập đến MAP_FIXED | MAP_FILE | Mã kiểu MAP_SHARED mà C cho phép.

Các quy tắc tương tự như trong C áp dụng. Bạn phải đảm bảo rằng mỗi giá trị không đổi tương ứng với một bit duy nhất, tức là quyền hạn của 2 (2, 4, 8, 16, ...).

Hầu hết thời gian, người ta sử dụng các số hex cho việc này:

OPTION_A = 0x01 
OPTION_B = 0x02 
OPTION_C = 0x04 
OPTION_D = 0x08 
OPTION_E = 0x10 
# ... 

Một số thích một phong cách con người dễ đọc hơn, tính toán các giá trị không đổi tự động sử dụng các nhà khai thác dịch chuyển:

OPTION_A = 1 << 0 
OPTION_B = 1 << 1 
OPTION_C = 1 << 2 
# ... 

Trong Python , bạn cũng có thể sử dụng ký pháp nhị phân để làm cho điều này rõ ràng hơn:

OPTION_A = 0b00000001 
OPTION_B = 0b00000010 
OPTION_C = 0b00000100 
OPTION_D = 0b00001000 

B ut vì ký hiệu này dài và khó đọc nên việc sử dụng ký hiệu hex hoặc ký hiệu nhị phân có thể thích hợp hơn.

11

Hằng số thường đi ở cấp mô-đun.Từ PEP 8:

Constants

hằng thường được xác định về mặt kĩ mô-đun và viết bằng tất cả chữ in hoa với dấu gạch tách từ. Ví dụ bao gồm MAX_OVERFLOW và TOTAL.

Nếu bạn muốn hằng số ở cấp lớp, hãy xác định chúng là thuộc tính lớp học.

3

Stdlib là một nguồn tuyệt vời của ví dụ sự hiểu biết về những gì bạn muốn có thể được tìm thấy trong doctestcode:

OPTIONS = {} 

# A function to add (register) an option. 
def register_option(name): 
    return OPTIONS.setdefault(name, 1 << len(OPTIONS)) 

# A function to test if an option exist. 
def has_option(options, name): 
    return bool(options & name) 

# All my option defined here. 
FOO = register_option('FOO') 
BAR = register_option('BAR') 
FOOBAR = register_option('FOOBAR') 


# Test if an option figure out in `ARG`. 
ARG = FOO | BAR 
print has_option(ARG, FOO) 
# True 
print has_option(ARG, BAR) 
# True 
print has_option(ARG, FOOBAR) 
# False 

N.B: Các module lại cũng sử dụng phong cách lập luận chút khôn ngoan quá, nếu bạn muốn một ví dụ khác.

2

Đặt tên thường là UPPERCASE_WITH_UNDERSCORE và thường là cấp mô-đun nhưng đôi khi chúng nằm trong lớp của riêng chúng. Một lý do chính đáng để được trong một lớp là khi các giá trị đặc biệt - chẳng hạn như cần phải có quyền hạn của hai:

class PowTwoConstants(object): 
    def __init__(self, items): 
     self.names = items 
     enum = 1 
     for name in items: 
      setattr(self, name, enum) 
      enum <<= 1 

constants = PowTwoConstants('ignore_case multiline newline'.split()) 
print constants.newline # prints 4 

Nếu bạn muốn để có thể xuất khẩu những hằng số để mô-đun cấp (hoặc bất kỳ không gian tên khác) bạn có thể thêm dòng sau vào lớp:

def export(self, namespace): 
     for name in self.names: 
      setattr(namespace, name, getattr(self, name)) 

và sau đó

import sys 
constants.export(sys.modules[__name__]) 
Các vấn đề liên quan