我在代码中使用以下语法来检查密钥是否存在:
@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()的替代方法,但只是想知道我提供的两个例子之间是否有任何优势。
答案 0 :(得分:1)
如果存在值为None
的键条目,则两个表达式将返回不同的结果:
>>> d = {'key': None}
>>> d.get("key") is not None
False
>>> 'key' in d
True
如果要检查字典中是否存在密钥,则应使用in
运算符;它也使你的意图更清晰。此外,它也适用于其他序列类型(例如list
,tuple
等。)
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或其他。