我需要检查文件是否在 perforce 中打开,如下所示:
if((p4.run("opened", self.file) != True):
但这不是正确的方法,我认为它总是正确的,请您帮忙解决这个问题谢谢
p4.run("opened")
返回与打开的文件相对应的结果列表(dicts),如果在您提供的路径规范内没有打开任何文件,则该列表将为空。尝试只打印出该值,或者更好地在 REPL 中运行它,以更好地了解函数返回的内容:
>>> from P4 import P4
>>> p4 = P4()
>>> p4.connect()
P4 [Samwise@Samwise-dvcs-1509687817 rsh:p4d.exe -i -r "c:\Perforce\test\.p4root"] connected
>>> p4.run("opened", "//...")
[{'depotFile': '//stream/test/foo', 'clientFile': '//Samwise-dvcs-1509687817/foo', 'rev': '2', 'haveRev': '2', 'action': 'edit', 'change': 'default', 'type': 'text', 'user': 'Samwise', 'client': 'Samwise-dvcs-1509687817'}]
>>> p4.run("opened", "//stream/test/foo")
[{'depotFile': '//stream/test/foo', 'clientFile': '//Samwise-dvcs-1509687817/foo', 'rev': '2', 'haveRev': '2', 'action': 'edit', 'change': 'default', 'type': 'text', 'user': 'Samwise', 'client': 'Samwise-dvcs-1509687817'}]
>>> p4.run("opened", "//stream/test/bar")
[]
我们可以看到 runningp4 opened //stream/test/foo
给了我们一个包含一个文件的列表(因为foo
它可以编辑),并且p4 opened //stream/test/bar
给了我们一个空列表(因为bar
它没有为任何东西打开)。
在 Python 中,一个列表如果为空则为“假”,如果为非空则为“真”。这与== False
和不同== True
,但它确实适用于大多数其他需要布尔值的上下文,包括if
语句和not
运算符:
>>> if p4.run("opened", "//stream/test/foo"):
... print("foo is open")
...
foo is open
>>> if not p4.run("opened", "//stream/test/bar"):
... print("bar is not open")
...
bar is not open
以这种方式使用列表被认为是完全 Pythonic 的(这就是语言中存在“真实性”概念的原因)而不是使用显式True
/False
值。
如果您确实需要一个精确的True
或False
值(例如,从一个声明为返回精确布尔值的函数返回),您可以使用该bool
函数将一个真值转换为,将一个假值转换True
为False
:
>>> bool(p4.run("opened", "//stream/test/foo"))
True
>>> bool(p4.run("opened", "//stream/test/bar"))
False
或使用len()
比较,这相当于同一件事:
>>> len(p4.run("opened", "//stream/test/foo")) > 0
True
>>> len(p4.run("opened", "//stream/test/bar")) > 0
False