2012-09-19 39 views
6

Tôi đang viết một số mã tăng số ở cuối tên tệp cho đến khi nó không còn ghi đè tệp hiện có nữa. Tôi đang tạo một số tệp, tất cả đều có cùng tên tệp cơ sở nhưng các phần mở rộng khác nhau, không có phần nào tôi muốn ghi đè lên.Tự động xây dựng biểu thức Boolean

phiên bản Naive:

prefix = 'hello0' 
while os.path.exists(prefix + '.abc') or os.path.exists(prefix + '.def') or os.path.exists(prefix + '.ghi'): 
    n = int(prefix[-1]) 
    prefix = prefix[:-1] + str(n + 1) # I know this doesn't work when n reaches two digits; my full code involves a regular expression 

Điều kiện rõ ràng là có thể nhận được rất dài và xấu xí khi có nhiều hơn một vài phần mở rộng. Tôi tóm tắt điều này thành một vòng lặp for.

phiên bản của tôi:

prefix = 'hello0' 
extensions = ('.abc', '.def', '.ghi') # there could be even more than this 
condition = True 
while condition: 
    condition = False 
    # if any of the paths still exist, set the condition back to True 
    for extension in extensions: 
     if os.path.exists(prefix + extension): 
      condition = True 

    n = int(prefix[-1]) 
    prefix = prefix[:-1] + str(n + 1) 

tôi vẫn cảm thấy đây là một chút vụng về: nó không phải là hoàn toàn rõ ràng những gì while vòng lặp được thực sự thử nghiệm. Có thể tạo biểu thức Boolean động không, thay vì đặt giá trị Boolean ?

Tôi nghĩ rằng sau đây có thể làm việc (tôi đã không kiểm tra nó, tôi chỉ nghĩ về nó khi viết này!) Nhưng tôi không nghĩ rằng tôi cần phải nghỉ mát để eval:

prefix = 'hello0' 
extensions = ('.abc', '.def', '.ghi') 

test = 'False' 
for extension in extensions: 
    test += " or os.path.exists(prefix + '" + extension + "')" 
while eval(test): 
    n = int(prefix[-1]) 
    prefix = prefix[:-1] + str(n + 1) 

Trả lời

9

Bạn có thể muốn sử dụng any() built-in với một máy phát điện:

while any(os.path.exists(prefix + extension) for extension in extensions): 

    # then increment prefix and try again, as in your example code 

này tính toán True hoặc False mà bạn cần với một cú pháp đơn giản hơn.

Nói chung, nếu tôi bao giờ cảm thấy bị cám dỗ khi sử dụng eval() bằng ngôn ngữ động như Python, thì điều đó có nghĩa là có một tính năng ngôn ngữ quan trọng mà tôi cần tìm hiểu. Ngôn ngữ động được cho là tạo mã đẹp mà không có thảm họa cố gắng viết và duy trì mã-viết-nhiều-mã hơn - vì vậy bạn đã làm chính xác điều đúng ở đây bằng cách hỏi về cách tiếp cận của bạn.

+1

Nó cũng thực hiện đánh giá ngắn mạch, giống như một chuỗi các biểu thức 'hoặc'. Cũng có một phương thức 'all()' tương ứng. –

+1

"... có một tính năng ngôn ngữ quan trọng mà tôi cần phải tìm hiểu." Không thể nhấn mạnh điều này đủ. Nếu bạn có một vấn đề, giải pháp là ở đó * một nơi nào đó *. –

+0

'any' là hoàn hảo, cảm ơn bạn. Và tôi hoàn toàn đồng ý về 'eval' là một dấu hiệu cho thấy bạn đã bỏ lỡ điều gì đó về ngôn ngữ! –

Các vấn đề liên quan