2012-02-21 24 views
6

Tôi đang tìm một cách đẹp hơn để gán một tập hợp với danh sách của danh sách nếu danh sách đó không trống, nếu không một danh sách khác sẽ được sử dụng.Chuyển đổi một danh sách để đặt, nhưng nếu trống sử dụng một danh sách mặc định

Nếu có thể tôi muốn một cách đẹp hơn để viết những dòng này (hoặc một cuộc tranh cãi tại sao điều này là cách đẹp nhất):

if args.onlyTheseServers: 
    only = set(args.onlyTheseServers) 
else: 
    only = set(availableServers) 
+2

Hãy nhớ rằng hướng dẫn phong cách Python chính thức ([PEP 8] (http://www.python.org/dev/peps/pep-0008/)) không thích bạn gọi biến của bạn hoặc thuộc tính 'onlyTheseServers'; nó thích 'only_these_servers' hơn. –

+1

'không phải là None' sẽ là True nếu bạn chuyển danh sách trống, bạn có thực sự muốn điều kiện là danh sách trống hoặc biến không là Không? – Geekfish

+0

@ Chris Morgan: Cảm ơn! Tôi sẽ xem xét và chấp nhận nó. Tôi là một chút Java-fied. :-) – Deleted

Trả lời

11
only = set(args.onlyTheseServers or availableServers) 
+0

Điều đó có ngữ nghĩa hơi khác so với bản gốc. Nó có thể hoặc có thể không quan trọng, nhưng nếu 'args.onlyTheseServers' là một danh sách rỗng thì bản gốc tạo ra một tập rỗng trong khi phiên bản của bạn sẽ sử dụng mặc định. – Duncan

+0

Đúng vậy. Ngữ nghĩa khác với mã mẫu của anh ta, nhưng thực sự khớp với tiêu đề câu hỏi ("... với nội dung của danh sách nếu danh sách không trống ..."). –

+0

Tôi đã gặp lỗi trong mẫu mã của mình. Vì vậy, bạn giải thích nó như tôi muốn nó, mặc dù ví dụ của tôi là lỗi. Cảm ơn! – Deleted

0

Hãy gọi cho tôi mua điên Tôi thích video này tốt hơn

only = set(args.onlyTheseServers) if args.onlyTheseServers is not None else set(availableServers) 
+1

Tôi thực sự phải gọi bạn là điên trên cái đó. ;-) Nhưng cảm ơn bạn đã trả lời! Có một phiếu bầu không (bỏ phiếu xuống một câu trả lời đúng sẽ là độc ác). :-) – Deleted

+0

@Kent, hehe. Đó là lý do tôi hoàn toàn mua 'một trường hợp là một trong những trường hợp thông thường và phải là' giải thích đầu tiên được đưa ra trong tài liệu của pep 308. http://docs.python.org/release/2.5/whatsnew/pep-308.html Vì vậy, bạn đọc nó chỉ = set (args.onlyTheseServers) ... bla bla một số trường hợp đặc biệt được điều trị ở đây ... –

1

tốt hơn Không thực sự nhiều, nhưng ít nhất một chút ngắn hơn:

only = set(availableServers if args.onlyTheseServers is None 
      else args.onlyTheseServers) 

Bạn cũng có thể làm

only = set(args.onlyTheseServers or availableServers) 

Nó hoạt động hơi khác vì nó không kiểm tra cho None, nhưng chỉ khi đối số là đúng - là - trong trường hợp này nó sẽ hoạt động.

3

Nhìn vào trước question của bạn, tôi muốn nói rằng những gì bạn đang thực sự tìm kiếm là một cách để gán một giá trị mặc định cho một tham số mất tích sử dụng argparse. Trong trường hợp đó, bạn chỉ nên sử dụng default như sau:

parser.add_argument('-o', '--only', default=default_servers, ...) 

Bằng cách này, khi tùy chọn -o/--only không được thông qua, các namespace sẽ có giá trị mặc định thiết lập một cách chính xác.

+2

Được chú ý. Tôi nghĩ rằng đó thực sự là điều anh ta muốn. Bây giờ tôi bực mình vì tôi không nghĩ về nó ... mà không cần kết nối nó với câu hỏi trước tôi đã * kết nối nó với argparse do tên biến 'args'! –

+0

@ Chris Morgan: Vâng, tôi là một người hỏi khó hiểu. Xin lỗi vì điều đó! – Deleted

+0

Giảm giá tốt! Tôi đã giải quyết nó theo cách bạn đề nghị. Tuy nhiên, để cho câu hỏi của tôi ở đây "đứng trên riêng của mình" (và để có thể giúp đỡ người khác với nó), tôi đánh dấu một trong những khác như câu trả lời ưa thích của tôi. Mặc dù nó cảm thấy một chút xấu, nếu chỉ có tôi đã có nhiều phiếu bầu hơn để đưa ra. :-) – Deleted

2

args.onlyTheseServers dường như là một biến đến từ argparse.

Nếu đó là trường hợp của bạn, bạn nên kiểm tra đối số default và phương pháp set_default().

Dưới đây là một ví dụ:

>>> import argparse 
>>> parser = argparse.ArgumentParser() 
>>> parser.add_argument('--foo', nargs='*', default=['1', '2', '3']) 
>>> args = parser.parse_args() 
>>> args.foo 
['1', '2', '3'] 
>>> args = parser.parse_args(['--foo', 'a', 'b']) 
>>> args.foo 
['a', 'b'] 
+0

Giảm giá tốt! Tôi đã giải quyết nó theo cách bạn đề nghị. Tuy nhiên, để cho câu hỏi của tôi ở đây "đứng trên riêng của mình" (và để có thể giúp đỡ người khác với nó), tôi đánh dấu một trong những khác như câu trả lời ưa thích của tôi. Mặc dù nó cảm thấy một chút xấu, nếu chỉ có tôi đã có nhiều phiếu bầu hơn để đưa ra. :-) – Deleted

+0

@Kent: Đừng lo lắng về nó :) * (trong tương lai nếu bạn có nghi ngờ về câu trả lời để chấp nhận, [ở đây] (http://meta.stackexchange.com/a/5235/177799) có một tài liệu tham khảo)* –

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