2013-03-27 21 views
21

Tôi đang cố gắng giữ mã của mình ở mức 80 ký tự trở xuống hiện nay vì tôi cho rằng nó trông đẹp hơn về mặt thẩm mỹ, phần lớn. Đôi khi, mặc dù, mã kết thúc lên trông tồi tệ hơn nếu tôi phải đặt ngắt dòng ở những nơi kỳ lạ.Làm cách nào để giữ độ rộng dưới 80 độ một cách sạch sẽ với các chuỗi dài?

Một điều tôi chưa tìm ra cách xử lý rất độc đáo nhưng là chuỗi dài. Ví dụ:

#0.........1........2........3........4.........5.........6.........7.........8xxxxxxxxx9xxxxxx 
def foo(): 
    if conditional(): 
     logger.info("<Conditional's meaning> happened, so we're not setting up the interface.") 
     return 

    #..... 

Kết thúc! Đặt nó trên dòng tiếp theo sẽ không giúp được gì:

#0.........1........2........3........4.........5.........6.........7.........8xxxxxxxxx9xxxxxx 
def foo(): 
    if conditional(): 
     logger.info(
      "<Conditional's meaning> happened, so we're not setting up the interface.") 
     return 

    #..... 

tôi có thể sử dụng ngắt dòng nhưng trông khủng khiếp:

#0.........1........2........3........4.........5.........6.........7.........8 
def foo(): 
    if conditional(): 
     logger.info(
      "<Conditional's meaning> happened, so we're not setting \ 
up the interface.") 
     return 

    #..... 

Phải làm gì? Rút ngắn chuỗi là một tùy chọn nhưng tôi không muốn tính dễ đọc của thư bị ảnh hưởng bởi một thứ gì đó tùy ý như bao nhiêu cấp độ thụt đầu dòng mà mã đã xảy ra tại thời điểm đó.

Trả lời

37

Bạn có thể chia chuỗi thành hai:

def foo(): 
    if conditional(): 
     logger.info("<Conditional's meaning> happened, so we're not " 
        "setting up the interface.") 

Nhiều chuỗi liên tiếp trong cùng một biểu thức sẽ được tự động concatenated into one, at compile time:

>>> def foo(): 
...  if conditional(): 
...   logger.info("<Conditional's meaning> happened, so we're not " 
...      "setting up the interface.") 
... 
>>> import dis 
>>> dis.dis(foo) 
    2   0 LOAD_GLOBAL    0 (conditional) 
       3 CALL_FUNCTION   0 
       6 POP_JUMP_IF_FALSE  25 

    3   9 LOAD_GLOBAL    1 (logger) 
      12 LOAD_ATTR    2 (info) 
      15 LOAD_CONST    1 ("<Conditional's meaning> happened, so we're not setting up the interface.") 
      18 CALL_FUNCTION   1 
      21 POP_TOP    
      22 JUMP_FORWARD    0 (to 25) 
     >> 25 LOAD_CONST    0 (None) 
      28 RETURN_VALUE   

Lưu ý LOAD_CONST cho dòng 3, bytecode cho hàm chứa một chuỗi, đã được ghép nối.

Nếu bạn đã thêm một + đến sự biểu hiện, hai hằng số riêng biệt được tạo ra:

>>> def foo(): 
...  if conditional(): 
...   logger.info("<Conditional's meaning> happened, so we're not " + 
...      "setting up the interface.") 
... 
>>> dis.dis(foo) 
    2   0 LOAD_GLOBAL    0 (conditional) 
       3 CALL_FUNCTION   0 
       6 POP_JUMP_IF_FALSE  29 

    3   9 LOAD_GLOBAL    1 (logger) 
      12 LOAD_ATTR    2 (info) 
      15 LOAD_CONST    1 ("<Conditional's meaning> happened, so we're not ") 

    4   18 LOAD_CONST    2 ('setting up the interface.') 
      21 BINARY_ADD   
      22 CALL_FUNCTION   1 
      25 POP_TOP    
      26 JUMP_FORWARD    0 (to 29) 
     >> 29 LOAD_CONST    0 (None) 
      32 RETURN_VALUE   

Python không gấp hoạt động nhị phân trên hằng số tại thời gian biên dịch (vì vậy +, *, - vv), trong các tối ưu hóa lổ nhìn trộm cho trình biên dịch byte. Vì vậy, đối với một số chuỗi nhất định, trình biên dịch có thể cũng thay thế + nối chuỗi các hằng số với kết quả được ghép nối. Xem peephole.c, đối với chuỗi (bao gồm cả chuỗi) tối ưu hóa này chỉ được áp dụng nếu kết quả được giới hạn trong 20 mục (ký tự) hoặc ít hơn.

+0

Trong khi có kết hợp tự động, tôi vẫn thích thêm '+' để làm rõ. Dù sao, +1. – orlp

+0

ah tốt đẹp, điều này chỉ có thể là nó. Trong tò mò là thực hiện tại thời gian phân tích cú pháp hoặc thời gian chạy? – Claudiu

+4

@nightcracker: Trình biên dịch * kết hợp các chuỗi. Với '+' bạn di chuyển kết nối đến thời gian chạy. –