我已经使用 python 几年了,从未见过is关键字在 if 条件下用作函数。我遇到了这段代码。它按预期工作,但我不知道 is() 的作用。
def face_ext(img):
gray = frame
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.5, minNeighbors=5)
if faces is():
return None
for(x, y, w, h) in faces:
cropped_face = img[y:y+h, x:x+w]
return cropped_face
Run Code Online (Sandbox Code Playgroud)
删除is()代码时会产生以下错误:
[INFO] Initializing face capture. Look the camera and wait ...
Traceback (most recent call last):
File "c:\Users\smoke\miniconda3\envs\skyhawk\Scripts\skyhawk-script.py", line 33, in <module>
sys.exit(load_entry_point('skyhawk', 'console_scripts', 'skyhawk')())
File "c:\Users\smoke\miniconda3\envs\skyhawk\lib\site-packages\click\core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "c:\Users\smoke\miniconda3\envs\skyhawk\lib\site-packages\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "c:\Users\smoke\miniconda3\envs\skyhawk\lib\site-packages\click\core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "c:\Users\smoke\miniconda3\envs\skyhawk\lib\site-packages\click\core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "c:\Users\smoke\miniconda3\envs\skyhawk\lib\site-packages\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\Users\smoke\miniconda3\envs\skyhawk\lib\site-packages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "c:\Users\smoke\miniconda3\envs\skyhawk\lib\site-packages\click\decorators.py", line 21, in new_func
return f(get_current_context(), *args, **kwargs)
File "c:\users\smoke\documents\dev\python\skyhawk-cli\skyhawk\commands\cmd_capture.py", line 21, in color
result = capture.Capture.color()
File "c:\users\smoke\documents\dev\python\skyhawk-cli\skyhawk\services\capture.py", line 41, in color
if face_ext(frame) is not None:
File "c:\users\smoke\documents\dev\python\skyhawk-cli\skyhawk\services\capture.py", line 31, in face_ext
if faces:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
[ WARN:0] terminating async callback
Run Code Online (Sandbox Code Playgroud)
完整的代码文件在此链接中给出。
它根本不是一个函数,它是恒等比较运算符。
\n\n\n对象\xe2\x80\x99s 身份的运算符
\nis和测试:当且仅当 x 和 y 是同一对象时才为 true。is notx is y
该声明
\nif faces is():\nRun Code Online (Sandbox Code Playgroud)\n应格式化为
\nif faces is ():\nRun Code Online (Sandbox Code Playgroud)\n即“这正是faces这个空元组对象的身份吗?”。
(这可能永远不会;比较应该是if faces == ():,或者可能只是if not faces:)。