Làm thế nào để kiểm tra xem một chìa khóa trong ** kwargs Tồn tại?


111

Python 3.2.3. Có một số ý tưởng được liệt kê ở đây , hoạt động trên var thông thường, nhưng có vẻ như ** kwargs chơi theo các quy tắc khác nhau ... vậy tại sao điều này không hoạt động và làm cách nào tôi có thể kiểm tra xem liệu khóa trong ** kwargs có tồn tại hay không?

if kwargs['errormessage']:
    print("It exists")

Tôi cũng nghĩ điều này sẽ hiệu quả, nhưng nó không -

if errormessage in kwargs:
    print("yeah it's here")

Tôi đoán vì kwargs có thể lặp lại? Tôi có phải lặp lại nó chỉ để kiểm tra xem có một khóa cụ thể nào không?


4
Không có quy tắc đặc biệt. Bạn vừa quên dấu ngoặc kép.
Lennart Regebro

Câu trả lời:


163

Bạn muốn

if 'errormessage' in kwargs:
    print("found it")

Để nhận giá trị của errormessage

if 'errormessage' in kwargs:
    print("errormessage equals " + kwargs.get("errormessage"))

Theo cách này, kwargschỉ là cách khác dict. Ví dụ đầu tiên của bạn if kwargs['errormessage'], có nghĩa là "lấy giá trị được liên kết với khóa" errormessage "trong kwargs, rồi kiểm tra giá trị bool của nó". Vì vậy, nếu không có khóa như vậy, bạn sẽ nhận được một KeyError.

Ví dụ thứ hai của bạn if errormessage in kwargs:, có nghĩa là "nếu kwargschứa phần tử được đặt tên bởi" errormessage"và trừ khi" errormessage"là tên của một biến, bạn sẽ nhận được một NameError.

Tôi nên đề cập rằng từ điển cũng có một phương thức .get()chấp nhận một tham số mặc định (chính nó mặc định thành None), để kwargs.get("errormessage")trả về giá trị nếu khóa đó tồn tại và Nonenếu không (tương tự như kwargs.get("errormessage", 17)những gì bạn có thể nghĩ). Khi bạn không quan tâm đến sự khác biệt giữa khóa hiện có và khóa có Nonegiá trị hoặc khóa không tồn tại, điều này có thể hữu ích.


Cảm ơn đã giải thích thêm! Luôn tốt cho những người mới tham gia python để có được một số thông tin cơ bản và các ví dụ khác về những gì có thể và những gì không. Theo tinh thần đó: Tôi nghĩ, kwargs.get("errormessage", 17)có thể trả lại giá trị của nó hoặc 17nếu không tồn tại sai lầm - nhưng tôi không chắc. Đúng không?
Honeybear

À vâng, đúng rồi. Tìm thấy nó ở đây . Cảm ơn ... chỉ muốn chắc chắn.
Honeybear

21

Câu trả lời của DSM và Tadeck trả lời trực tiếp câu hỏi của bạn.

Trong các tập lệnh của mình, tôi thường sử dụng tiện ích dict.pop()để xử lý các đối số tùy chọn và bổ sung. Đây là một ví dụ về print()trình bao bọc đơn giản :

def my_print(*args, **kwargs):
    prefix = kwargs.pop('prefix', '')
    print(prefix, *args, **kwargs)

Sau đó:

>>> my_print('eggs')
 eggs
>>> my_print('eggs', prefix='spam')
spam eggs

Như bạn có thể thấy, nếu prefixkhông được chứa trong kwargs, thì mặc định ''(chuỗi trống) đang được lưu trữ trong prefixbiến cục bộ. Nếu nó được đưa ra, thì giá trị của nó đang được sử dụng.

Đây thường là một công thức nhỏ gọn và dễ đọc để viết các trình bao bọc cho bất kỳ loại hàm nào: Luôn chỉ chuyển qua các đối số mà bạn không hiểu và thậm chí không biết chúng có tồn tại hay không. Nếu bạn luôn chuyển qua *args**kwargsbạn làm cho mã của mình chậm hơn và yêu cầu nhập nhiều hơn một chút, nhưng nếu giao diện của hàm được gọi (trong trường hợp này print) thay đổi, bạn không cần phải thay đổi mã của mình. Cách tiếp cận này làm giảm thời gian phát triển trong khi hỗ trợ tất cả các thay đổi giao diện.


Cảm ơn bạn đã chỉ ra cách chỉ định giá trị mặc định cho prefix.
HBat

11

Nó chỉ là thế này:

if 'errormessage' in kwargs:
    print("yeah it's here")

Bạn cần kiểm tra xem khóa có trong từ điển hay không. Cú pháp cho điều đó là some_key in some_dict(đâu some_keylà thứ có thể băm, không nhất thiết là một chuỗi).

Những ý tưởng bạn đã liên kết ( những ý tưởng này ) chứa các ví dụ để kiểm tra xem khóa cụ thể có tồn tại trong từ điển được trả về bởi locals()và hay không globals(). Ví dụ của bạn cũng tương tự, vì bạn đang kiểm tra sự tồn tại của khóa cụ thể trong kwargstừ điển (từ điển chứa các đối số từ khóa).


3

Một cách là tự thêm nó vào! Làm sao? Bằng cách hợp nhất kwargsvới một loạt các giá trị mặc định. Điều này sẽ không phù hợp trong tất cả các trường hợp, ví dụ, nếu bạn không biết trước các chìa khóa. Tuy nhiên, nếu có, đây là một ví dụ đơn giản:

import sys

def myfunc(**kwargs):
    args = {'country':'England','town':'London',
            'currency':'Pound', 'language':'English'}

    diff = set(kwargs.keys()) - set(args.keys())
    if diff:
        print("Invalid args:",tuple(diff),file=sys.stderr)
        return

    args.update(kwargs)            
    print(args)

Các giá trị mặc định được đặt trong từ điển args, bao gồm tất cả các khóa mà chúng tôi mong đợi. Trước tiên, chúng tôi kiểm tra xem có bất kỳ khóa bất ngờ nào trong kwargs không. Sau đó, chúng tôi cập nhật argsvới kwargsđó sẽ ghi đè lên bất kỳ giá trị mới mà người dùng đã thiết lập. Chúng tôi không cần phải kiểm tra xem khóa có tồn tại hay không, chúng tôi hiện sử dụng argslàm từ điển đối số của mình và không cần thêm nữa kwargs.


1

Bạn có thể tự mình khám phá những điều đó một cách dễ dàng:

def hello(*args, **kwargs):
    print kwargs
    print type(kwargs)
    print dir(kwargs)

hello(what="world")

13
Loại bỏ "dễ dàng" và sau đó đó là một câu trả lời tốt hơn. Nếu nó dễ dàng cho mọi người, thì chúng tôi sẽ không cần trang web này. Việc tìm intoán tử trong chính nó không phải là dễ dàng nếu bạn chưa bao giờ lập trình và / hoặc chưa quen với Python. Nó chỉ được gợi ý trong dict.get()dict.setdefault()giúp đỡ.
cfi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.