bạn sẽ hầu như không bao giờ đã không xác định bằng Python, và khi bạn làm điều đó thường có nghĩa là bạn có m ade một sai lầm.Tuy nhiên, thuận tiện, hầu hết các loại giá trị thường được sử dụng làm mặc định (vùng chứa trống, chuỗi có độ dài bằng không, 0 và) là "sai" trong Python, vì vậy đôi khi bạn sẽ thấy những thứ như thế này tận dụng lợi thế khai thác công trình boolean bằng Python:
name = name or "Guido" # if name is empty, set it to "Guido"
numb = numb or 42 # if numb is zero, set it to 42
lý do làm việc này là Python dừng đánh giá or
nếu đối số đầu tiên là "truthy", được gọi là ngắn mạch, và trong cả hai trường hợp trả về đối số thực tế, chứ không phải là chỉ đơn thuần là True
hoặc False
, là kết quả của nó. Vì vậy, nếu name
là "Jim" thì "Jim" or "Guido"
sẽ đánh giá là "Jim"
vì "Jim"
là một chuỗi có độ dài khác 0 và do đó "trung thực".
Tất nhiên, điều này không hoạt động tốt như vậy khi bạn không biết loại giá trị bạn đang xử lý và/hoặc giá trị "giả" là giá trị hợp lệ. Tuy nhiên, nó hoạt động khá tốt với những thứ như các file cấu hình và raw_input()
nơi một giá trị thiếu sẽ trả về một chuỗi rỗng:
name = raw_input("What is your name? ") or "Guido"
Một thành ngữ phổ biến được sử dụng khi giao dịch với các mục trong một cuốn từ điển. Phương thức get()
của lớp từ điển cho phép bạn chỉ định giá trị mặc định sẽ được sử dụng nếu biến không có trong từ điển.
name = values.get("name", "Guido")
Điều này có thể được sử dụng khi chức năng của bạn được chuyển qua đối số từ khóa sử dụng quy ước **kwargs
. Bạn thể cũng sử dụng nó với các biến, như globals()
và locals()
chức năng quay trở lại, tương ứng, tất cả các biến toàn cầu hay địa phương hiện trong phạm vi như một cuốn từ điển:
name = locals().get("name", "Guido")
Tuy nhiên, như tôi đã nói, bạn sẽ hiếm khi có các biến không xác định thực sự trong Python. Trong các trường hợp như khung Web, bạn sẽ được chuyển đối số chuỗi truy vấn dưới dạng từ điển, ví dụ và có thể sử dụng phương thức .get()
của từ điển trên đó. Trong trường hợp hiếm hoi mà tên thực sự không tồn tại (ví dụ, tệp cấu hình của bạn là cú pháp Python và bạn nhập nó như là một mô-đun Python chứ không phải phân tích cú pháp nó, và bạn muốn người dùng có thể bỏ qua một số giá trị ... hoặc một cái gì đó đều lập dị) sau đó bạn có thể sử dụng getattr()
, trong đó (như từ điển của .get()
) chấp nhận một giá trị mặc định:
import config
name = getattr(config, "name", "Guido") # rather than just name.config
hoặc chỉ cần để cho nó ném một NameError
và nắm bắt nó.
Có vẻ như nó có vẻ trùng lặp. Cảm ơn Adam! –
'$ foo || =" cái gì "' sẽ gán lại '$ foo' nếu nó đã là * false *. Tất nhiên 'undef' là sai, nhưng sau đó là số không và chuỗi rỗng. Để gán lại chỉ một giá trị không xác định sử dụng dấu gạch chéo thay vào đó, như '$ foo // =" what "' – Borodin
Lưu ý rằng '//' (và phần mở rộng của nó, '// =') đã được thêm vào trong perl 5.10. Nếu bạn vẫn bị mắc kẹt trên 5.8.x, bạn sẽ không thể sử dụng '// =' (và bạn nên nghiêm túc xem xét nâng cấp nếu có thể). –