如果'键'在dict中:而不是如果dict.get(' key')不是None:?

时间:2017-04-01 09:32:22

标签: python dictionary

我在代码中使用以下语法来检查密钥是否存在:

@Lob
private byte[] image;

但是,我在其他人的代码中看到了以下语法:

    public void handleFileUpload(FileUploadEvent event) {
        try {
            InputStream input = file.getInputStream();
            byte[] image = IOUtils.toByteArray(input); // Apache commons IO.
            auction.setImage(image);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


  }

我只是想知道哪种方式最好表达一个字典键空检查,如果有一个优势(如果有的话)使用一个优于另一个。

我看到现有问题解决similar question使用.get()的替代方法,但只是想知道我提供的两个例子之间是否有任何优势。

3 个答案:

答案 0 :(得分:1)

如果存在值为None的键条目,则两个表达式将返回不同的结果:

>>> d = {'key': None}
>>> d.get("key") is not None
False
>>> 'key' in d
True

如果要检查字典中是否存在密钥,则应使用in运算符;它也使你的意图更清晰。此外,它也适用于其他序列类型(例如listtuple等。)

顺便说一句,不要使用dict作为变量名;它会影响内置函数/类型dict

答案 1 :(得分:1)

这样更好。

if 'key' in dict:
   print "key found"

此外,正如@falsetrue所述,如果None中的dict值为if d.get('key') is not None,则False变为dict.get,这可能不是预期的行为。

key在表达式中使用值时非常有用,并且希望在dict不在d['key'] = 4 a = 5 + d.get('key', 0) # returns 0 if `key` is not in `d` 时使用默认值。

USE [edata]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[InsertNewUser](
 @neuname NVARCHAR(255),
 @neupassword NVARCHAR(255),
 @neuposition NVARCHAR(255)
 )

AS

BEGIN 

BEGIN TRY

 DECLARE @check INT;

 SET @check = (SELECT count(eid) FROM eusers WHERE euname = @neuname);

IF(@check = 0)

INSERT INTO  eusers(euname,eupassword,eposition)
VALUES(@neuname,@neupassword,@neuposition);

DECLARE @lastid INT;

SET @lastid = @@IDENTITY;

RETURN @lastid;


END TRY


BEGIN CATCH

SELECT ERROR_LINE() as errline,
       ERROR_MESSAGE() as errmessage,
       ERROR_SEVERITY() as errsevirity

END CATCH

END

答案 2 :(得分:1)

这两种方式不同。

dict.get("key") is not None表示dict有“key” dict [“key”]不是None。

"key" in dict表示dict有“key”而不关心它的值是None或其他。