From d2eef1955c777ef6110c7a74d2a9ca9e4e1d958c Mon Sep 17 00:00:00 2001 From: Dylan Herman Date: Thu, 12 May 2022 07:59:00 -0500 Subject: [PATCH] add mypy check for return-any (#24379) * add mypy check for return-any * remove unused import * typing * remove unnecessary variable typing * cleanup * cleanup * bump submodules * small fixes * only a problem on mac Co-authored-by: Willem Melching --- .pre-commit-config.yaml | 1 + cereal | 2 +- common/realtime.py | 4 ++-- common/xattr.py | 7 ++++--- panda | 2 +- scripts/waste.py | 2 +- selfdrive/athena/registration.py | 4 ++-- selfdrive/boardd/pandad.py | 6 +++--- selfdrive/car/__init__.py | 3 ++- selfdrive/car/docs.py | 8 ++++--- selfdrive/car/volkswagen/values.py | 2 +- selfdrive/controls/lib/events.py | 2 ++ selfdrive/controls/lib/vehicle_model.py | 28 ++++++++++++------------- selfdrive/debug/live_cpu_and_temp.py | 2 +- selfdrive/debug/run_process_on_route.py | 2 +- selfdrive/hardware/tici/agnos.py | 18 +++++++++------- selfdrive/locationd/calibrationd.py | 2 +- selfdrive/manager/process_config.py | 4 ++-- selfdrive/sensord/rawgps/compare.py | 4 ++-- selfdrive/updated.py | 2 +- selfdrive/version.py | 6 +++--- tools/lib/bootlog.py | 4 ++++ 22 files changed, 65 insertions(+), 50 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 912ba1344e1d11..81ce927f655b89 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,6 +23,7 @@ repos: additional_dependencies: ['lxml', 'numpy', 'types-atomicwrites', 'types-pycurl', 'types-requests', 'types-certifi'] args: - --warn-redundant-casts + - --warn-return-any - --warn-unreachable - --warn-unused-ignores #- --html-report=/home/batman/openpilot diff --git a/cereal b/cereal index 67e5c5ca378fcf..8e8831f8e03deb 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 67e5c5ca378fcf6db53e968e5ad9e4a98d32ed0f +Subproject commit 8e8831f8e03deb62dd5fcfc638e134cdc8e9adbf diff --git a/common/realtime.py b/common/realtime.py index c77bab0519e05d..8976832141e413 100644 --- a/common/realtime.py +++ b/common/realtime.py @@ -36,12 +36,12 @@ class Priority: def set_realtime_priority(level: int) -> None: if not PC: - os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level)) # type: ignore[attr-defined] + os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level)) # type: ignore[attr-defined] # pylint: disable=no-member def set_core_affinity(cores: List[int]) -> None: if not PC: - os.sched_setaffinity(0, cores) + os.sched_setaffinity(0, cores) # pylint: disable=no-member def config_realtime_process(cores: Union[int, List[int]], priority: int) -> None: diff --git a/common/xattr.py b/common/xattr.py index fa61b9e0fc5635..26616fd638c701 100644 --- a/common/xattr.py +++ b/common/xattr.py @@ -1,5 +1,6 @@ import os from cffi import FFI +from typing import Any, List # Workaround for the EON/termux build of Python having os.*xattr removed. ffi = FFI() @@ -11,7 +12,7 @@ """) libc = ffi.dlopen(None) -def setxattr(path, name, value, flags=0): +def setxattr(path, name, value, flags=0) -> None: path = path.encode() name = name.encode() if libc.setxattr(path, name, value, len(value), flags) == -1: @@ -29,7 +30,7 @@ def getxattr(path, name, size=128): raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: getxattr({path}, {name}, {size})") return ffi.buffer(value)[:l] -def listxattr(path, size=128): +def listxattr(path, size=128) -> List[Any]: path = path.encode() attrs = ffi.new(f"char[{size}]") l = libc.listxattr(path, attrs, size) @@ -38,7 +39,7 @@ def listxattr(path, size=128): # attrs is b'\0' delimited values (so chop off trailing empty item) return [a.decode() for a in ffi.buffer(attrs)[:l].split(b"\0")[0:-1]] -def removexattr(path, name): +def removexattr(path, name) -> None: path = path.encode() name = name.encode() if libc.removexattr(path, name) == -1: diff --git a/panda b/panda index eb662e4e5014a3..d5bd81e5b517c7 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit eb662e4e5014a3fc3c04512d708f61080c7707c1 +Subproject commit d5bd81e5b517c79e164d87b96355e6bc75915da0 diff --git a/scripts/waste.py b/scripts/waste.py index f2820ea670085b..d3c96bf1980f9d 100755 --- a/scripts/waste.py +++ b/scripts/waste.py @@ -6,7 +6,7 @@ from setproctitle import setproctitle # pylint: disable=no-name-in-module def waste(core): - os.sched_setaffinity(0, [core,]) + os.sched_setaffinity(0, [core,]) # pylint: disable=no-member m1 = np.zeros((200, 200)) + 0.8 m2 = np.zeros((200, 200)) + 1.2 diff --git a/selfdrive/athena/registration.py b/selfdrive/athena/registration.py index cc4bd7e6471863..2748934361617e 100755 --- a/selfdrive/athena/registration.py +++ b/selfdrive/athena/registration.py @@ -23,13 +23,13 @@ def is_registered_device() -> bool: return dongle not in (None, UNREGISTERED_DONGLE_ID) -def register(show_spinner=False) -> str: +def register(show_spinner=False) -> Optional[str]: params = Params() params.put("SubscriberInfo", HARDWARE.get_subscriber_info()) IMEI = params.get("IMEI", encoding='utf8') HardwareSerial = params.get("HardwareSerial", encoding='utf8') - dongle_id = params.get("DongleId", encoding='utf8') + dongle_id: Optional[str] = params.get("DongleId", encoding='utf8') needs_registration = None in (IMEI, HardwareSerial, dongle_id) pubkey = Path(PERSIST+"/comma/id_rsa.pub") diff --git a/selfdrive/boardd/pandad.py b/selfdrive/boardd/pandad.py index 6619afe72fb68d..306d764e590b5d 100755 --- a/selfdrive/boardd/pandad.py +++ b/selfdrive/boardd/pandad.py @@ -4,7 +4,7 @@ import usb1 import time import subprocess -from typing import NoReturn +from typing import List, NoReturn from functools import cmp_to_key from panda import DEFAULT_FW_FN, DEFAULT_H7_FW_FN, MCU_TYPE_H7, Panda, PandaDFU @@ -102,7 +102,7 @@ def main() -> NoReturn: cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}") # Flash pandas - pandas = [] + pandas: List[Panda] = [] for serial in panda_serials: pandas.append(flash_panda(serial)) @@ -119,7 +119,7 @@ def main() -> NoReturn: # sort pandas to have deterministic order pandas.sort(key=cmp_to_key(panda_sort_cmp)) - panda_serials = list(map(lambda p: p.get_usb_serial(), pandas)) + panda_serials = list(map(lambda p: p.get_usb_serial(), pandas)) # type: ignore # log panda fw versions params.put("PandaSignatures", b','.join(p.get_signature() for p in pandas)) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 408e0d075ff7b7..7bb91c40f71b4a 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,6 +1,7 @@ # functions common among cars from cereal import car from common.numpy_fast import clip +from typing import Dict # kg of standard extra cargo to count for drive, gas, etc... STD_CARGO_KG = 136. @@ -41,7 +42,7 @@ def scale_tire_stiffness(mass, wheelbase, center_to_front, tire_stiffness_factor return tire_stiffness_front, tire_stiffness_rear -def dbc_dict(pt_dbc, radar_dbc, chassis_dbc=None, body_dbc=None): +def dbc_dict(pt_dbc, radar_dbc, chassis_dbc=None, body_dbc=None) -> Dict[str, str]: return {'pt': pt_dbc, 'radar': radar_dbc, 'chassis': chassis_dbc, 'body': body_dbc} diff --git a/selfdrive/car/docs.py b/selfdrive/car/docs.py index 8fb1547f06e6cb..c1d3f56b428735 100755 --- a/selfdrive/car/docs.py +++ b/selfdrive/car/docs.py @@ -45,7 +45,8 @@ def get_all_car_info() -> List[CarInfo]: all_car_info.append(_car_info.init(CP, non_tested_cars, ALL_FOOTNOTES)) # Sort cars by make and model + year - return natsorted(all_car_info, key=lambda car: (car.make + car.model).lower()) + sorted_cars: List[CarInfo] = natsorted(all_car_info, key=lambda car: (car.make + car.model).lower()) + return sorted_cars def sort_by_tier(all_car_info: List[CarInfo]) -> Dict[Tier, List[CarInfo]]: @@ -65,8 +66,9 @@ def generate_cars_md(all_car_info: List[CarInfo], template_fn: str) -> str: template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True) footnotes = [fn.value.text for fn in ALL_FOOTNOTES] - return template.render(tiers=sort_by_tier(all_car_info), all_car_info=all_car_info, - footnotes=footnotes, Star=Star, Column=Column) + cars_md: str = template.render(tiers=sort_by_tier(all_car_info), all_car_info=all_car_info, + footnotes=footnotes, Star=Star, Column=Column) + return cars_md if __name__ == "__main__": diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index abba70fbba0afe..51e7c85dbcc888 100755 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -41,7 +41,7 @@ class DBC_FILES: mqb = "vw_mqb_2010" # Used for all cars with MQB-style CAN messaging -DBC = defaultdict(lambda: dbc_dict(DBC_FILES.mqb, None)) # type: Dict[str, Dict[str, str]] +DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict(DBC_FILES.mqb, None)) BUTTON_STATES = { "accelCruise": False, diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 12a42a7e3c99f8..2fbb07cb8c9405 100644 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -135,6 +135,8 @@ def __str__(self) -> str: return f"{self.alert_text_1}/{self.alert_text_2} {self.priority} {self.visual_alert} {self.audible_alert}" def __gt__(self, alert2) -> bool: + if not isinstance(alert2, Alert): + return False return self.priority > alert2.priority diff --git a/selfdrive/controls/lib/vehicle_model.py b/selfdrive/controls/lib/vehicle_model.py index 3f180d3252cd0a..0750384918dc31 100755 --- a/selfdrive/controls/lib/vehicle_model.py +++ b/selfdrive/controls/lib/vehicle_model.py @@ -29,22 +29,22 @@ def __init__(self, CP: car.CarParams): CP: Car Parameters """ # for math readability, convert long names car params into short names - self.m = CP.mass - self.j = CP.rotationalInertia - self.l = CP.wheelbase - self.aF = CP.centerToFront - self.aR = CP.wheelbase - CP.centerToFront - self.chi = CP.steerRatioRear - - self.cF_orig = CP.tireStiffnessFront - self.cR_orig = CP.tireStiffnessRear + self.m: float = CP.mass + self.j: float = CP.rotationalInertia + self.l: float = CP.wheelbase + self.aF: float = CP.centerToFront + self.aR: float = CP.wheelbase - CP.centerToFront + self.chi: float = CP.steerRatioRear + + self.cF_orig: float = CP.tireStiffnessFront + self.cR_orig: float = CP.tireStiffnessRear self.update_params(1.0, CP.steerRatio) def update_params(self, stiffness_factor: float, steer_ratio: float) -> None: """Update the vehicle model with a new stiffness factor and steer ratio""" - self.cF = stiffness_factor * self.cF_orig - self.cR = stiffness_factor * self.cR_orig - self.sR = steer_ratio + self.cF: float = stiffness_factor * self.cF_orig + self.cR: float = stiffness_factor * self.cR_orig + self.sR: float = steer_ratio def steady_state_sol(self, sa: float, u: float, roll: float) -> np.ndarray: """Returns the steady state solution. @@ -221,10 +221,10 @@ def dyn_ss_sol(sa: float, u: float, roll: float, VM: VehicleModel) -> np.ndarray """ A, B = create_dyn_state_matrices(u, VM) inp = np.array([[sa], [roll]]) - return -solve(A, B) @ inp + return -solve(A, B) @ inp # type: ignore -def calc_slip_factor(VM): +def calc_slip_factor(VM: VehicleModel) -> float: """The slip factor is a measure of how the curvature changes with speed it's positive for Oversteering vehicle, negative (usual case) otherwise. """ diff --git a/selfdrive/debug/live_cpu_and_temp.py b/selfdrive/debug/live_cpu_and_temp.py index b244f7cb0ed028..baeebb1c4ca71c 100755 --- a/selfdrive/debug/live_cpu_and_temp.py +++ b/selfdrive/debug/live_cpu_and_temp.py @@ -88,7 +88,7 @@ def proc_name(proc): pass print("Top CPU usage:") - for k, v in sorted(procs.items(), key=lambda item: item[1], reverse=True)[:10]: + for k, v in sorted(procs.items(), key=lambda item: item[1], reverse=True)[:10]: # type: ignore print(f"{k.rjust(70)} {v:.2f} %") print() diff --git a/selfdrive/debug/run_process_on_route.py b/selfdrive/debug/run_process_on_route.py index a6e67d2b24f66a..63b0733bba1cfc 100755 --- a/selfdrive/debug/run_process_on_route.py +++ b/selfdrive/debug/run_process_on_route.py @@ -25,7 +25,7 @@ # Remove message generated by the process under test and merge in the new messages produces = {o.which() for o in outputs} inputs = [i for i in inputs if i.which() not in produces] - outputs = sorted(inputs + outputs, key=lambda x: x.logMonoTime) + outputs = sorted(inputs + outputs, key=lambda x: x.logMonoTime) # type: ignore fn = f"{args.route}_{args.process}.bz2" save_log(fn, outputs) diff --git a/selfdrive/hardware/tici/agnos.py b/selfdrive/hardware/tici/agnos.py index e36ef9cfbb7392..e664654c65ed18 100755 --- a/selfdrive/hardware/tici/agnos.py +++ b/selfdrive/hardware/tici/agnos.py @@ -7,7 +7,7 @@ import subprocess import time import os -from typing import Generator +from typing import Dict, Generator, Union SPARSE_CHUNK_FMT = struct.Struct('H2xI4x') @@ -99,26 +99,30 @@ def get_partition_path(target_slot_number: int, partition: dict) -> str: return path -def verify_partition(target_slot_number: int, partition: dict) -> bool: +def verify_partition(target_slot_number: int, partition: Dict[str, Union[str, int]]) -> bool: full_check = partition['full_check'] path = get_partition_path(target_slot_number, partition) - partition_size = partition['size'] + if not isinstance(partition['size'], int): + return False + partition_size: int = partition['size'] + if not isinstance(partition['hash_raw'], str): + return False + partition_hash: str = partition['hash_raw'] with open(path, 'rb+') as out: if full_check: raw_hash = hashlib.sha256() - pos = 0 - chunk_size = 1024 * 1024 + pos, chunk_size = 0, 1024 * 1024 while pos < partition_size: n = min(chunk_size, partition_size - pos) raw_hash.update(out.read(n)) pos += n - return raw_hash.hexdigest().lower() == partition['hash_raw'].lower() + return raw_hash.hexdigest().lower() == partition_hash.lower() else: out.seek(partition_size) - return out.read(64) == partition['hash_raw'].lower().encode() + return out.read(64) == partition_hash.lower().encode() def clear_partition_hash(target_slot_number: int, partition: dict) -> None: diff --git a/selfdrive/locationd/calibrationd.py b/selfdrive/locationd/calibrationd.py index 51c84b847db6e7..6a8707a6cdbc96 100755 --- a/selfdrive/locationd/calibrationd.py +++ b/selfdrive/locationd/calibrationd.py @@ -48,7 +48,7 @@ class Calibration: def is_calibration_valid(rpy: np.ndarray) -> bool: - return (PITCH_LIMITS[0] < rpy[1] < PITCH_LIMITS[1]) and (YAW_LIMITS[0] < rpy[2] < YAW_LIMITS[1]) + return (PITCH_LIMITS[0] < rpy[1] < PITCH_LIMITS[1]) and (YAW_LIMITS[0] < rpy[2] < YAW_LIMITS[1]) # type: ignore def sanity_clip(rpy: np.ndarray) -> np.ndarray: diff --git a/selfdrive/manager/process_config.py b/selfdrive/manager/process_config.py index 8fa0454011d214..901a9287965842 100644 --- a/selfdrive/manager/process_config.py +++ b/selfdrive/manager/process_config.py @@ -8,10 +8,10 @@ WEBCAM = os.getenv("USE_WEBCAM") is not None def driverview(started: bool, params: Params, CP: car.CarParams) -> bool: - return params.get_bool("IsDriverViewEnabled") + return params.get_bool("IsDriverViewEnabled") # type: ignore def notcar(started: bool, params: Params, CP: car.CarParams) -> bool: - return CP.notCar + return CP.notCar # type: ignore def logging(started, params, CP: car.CarParams) -> bool: run = (not CP.notCar) or not params.get_bool("DisableLogging") diff --git a/selfdrive/sensord/rawgps/compare.py b/selfdrive/sensord/rawgps/compare.py index 073647499bcf52..0ec15b81fb5467 100755 --- a/selfdrive/sensord/rawgps/compare.py +++ b/selfdrive/sensord/rawgps/compare.py @@ -31,7 +31,7 @@ tm = m if tm is None: continue - + if not i.measurementStatus.measurementNotUsable and i.measurementStatus.satelliteTimeIsKnown: sat_time = (i.unfilteredMeasurementIntegral + i.unfilteredMeasurementFraction + i.latency) / 1000 ublox_psuedorange = tm.pseudorange @@ -56,7 +56,7 @@ pr_err /= len(car) speed_err /= len(car) print("avg psuedorange err %f avg speed err %f" % (pr_err, speed_err)) - for c in sorted(car, key=lambda x: abs(x[1] - x[3] - pr_err)): + for c in sorted(car, key=lambda x: abs(x[1] - x[3] - pr_err)): # type: ignore svid, ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed, cno = c print("svid: %3d pseudorange: %10.2f m speed: %8.2f m/s meas: %12.2f speed: %10.2f meas_err: %10.3f speed_err: %8.3f cno: %d" % (svid, ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed, diff --git a/selfdrive/updated.py b/selfdrive/updated.py index c7df24c52ab711..8c2dfbd1fbd51c 100755 --- a/selfdrive/updated.py +++ b/selfdrive/updated.py @@ -311,7 +311,7 @@ def fetch_update(wait_helper: WaitTimeHelper) -> bool: cur_hash = run(["git", "rev-parse", "HEAD"], OVERLAY_MERGED).rstrip() upstream_hash = run(["git", "rev-parse", "@{u}"], OVERLAY_MERGED).rstrip() - new_version = cur_hash != upstream_hash + new_version: bool = cur_hash != upstream_hash git_fetch_result = check_git_fetch_result(git_fetch_output) cloudlog.info(f"comparing {cur_hash} to {upstream_hash}") diff --git a/selfdrive/version.py b/selfdrive/version.py index 5517fe728ab84a..f944e870aeffc5 100644 --- a/selfdrive/version.py +++ b/selfdrive/version.py @@ -55,7 +55,7 @@ def get_origin(default: Optional[str] = None) -> Optional[str]: @cache def get_normalized_origin(default: Optional[str] = None) -> Optional[str]: - origin = get_origin() + origin: Optional[str] = get_origin() if origin is None: return default @@ -74,7 +74,7 @@ def get_version() -> str: @cache def get_short_version() -> str: - return get_version().split('-')[0] + return get_version().split('-')[0] # type: ignore @cache def is_prebuilt() -> bool: @@ -85,7 +85,7 @@ def is_prebuilt() -> bool: def is_comma_remote() -> bool: # note to fork maintainers, this is used for release metrics. please do not # touch this to get rid of the orange startup alert. there's better ways to do that - origin = get_origin() + origin: Optional[str] = get_origin() if origin is None: return False diff --git a/tools/lib/bootlog.py b/tools/lib/bootlog.py index dc1cf35c52f340..4e711204002bc9 100644 --- a/tools/lib/bootlog.py +++ b/tools/lib/bootlog.py @@ -36,9 +36,13 @@ def datetime(self) -> datetime.datetime: return timestamp_to_datetime(self._timestamp) def __eq__(self, b) -> bool: + if not isinstance(b, Bootlog): + return False return self.datetime == b.datetime def __lt__(self, b) -> bool: + if not isinstance(b, Bootlog): + return False return self.datetime < b.datetime