{"record":{"id":"7c0db472a3aec5a1","repo":"open-mmlab/mmdetection","slug":"the-type-of-frame-range-must-be-int-or-list","errorCode":null,"errorMessage":"The type of frame_range must be int or list.","messagePattern":"The type of frame_range must be int or list\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"mmdet/datasets/transforms/frame_sampling.py","lineNumber":109,"sourceCode":"    \"\"\"\n\n    def __init__(self,\n                 num_ref_imgs: int = 1,\n                 frame_range: Union[int, List[int]] = 10,\n                 filter_key_img: bool = True,\n                 collect_video_keys: List[str] = ['video_id', 'video_length']):\n        self.num_ref_imgs = num_ref_imgs\n        self.filter_key_img = filter_key_img\n        if isinstance(frame_range, int):\n            assert frame_range >= 0, 'frame_range can not be a negative value.'\n            frame_range = [-frame_range, frame_range]\n        elif isinstance(frame_range, list):\n            assert len(frame_range) == 2, 'The length must be 2.'\n            assert frame_range[0] <= 0 and frame_range[1] >= 0\n            for i in frame_range:\n                assert isinstance(i, int), 'Each element must be int.'\n        else:\n            raise TypeError('The type of frame_range must be int or list.')\n        self.frame_range = frame_range\n        super().__init__(collect_video_keys=collect_video_keys)\n\n    def sampling_frames(self, video_length: int, key_frame_id: int):\n        \"\"\"Sampling frames.\n\n        Args:\n            video_length (int): The length of the video.\n            key_frame_id (int): The key frame id.\n\n        Returns:\n            list[int]: The sampled frame indices.\n        \"\"\"\n        if video_length > 1:\n            left = max(0, key_frame_id + self.frame_range[0])\n            right = min(key_frame_id + self.frame_range[1], video_length - 1)\n            frame_ids = list(range(0, video_length))\n","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/open-mmlab/mmdetection/blob/cfd5d3a985b0249de009b67d04f37263e11cdf3d/mmdet/datasets/transforms/frame_sampling.py#L91-L127","documentation":"This transform (BaseFrameSample in mmdet's frame_sampling) accepts frame_range as either an int (interpreted symmetrically) or a list of exactly 2 ints [left, right] with left <= 0 <= right. Any other type — a string from a config, a tuple, a single-element list, or None — raises TypeError in __init__.","triggerScenarios":"Configuring a frame sampling transform with frame_range='3' (string), (1, 3) (tuple), 2.0 (float), or [1] (wrong-length list). Note the list-element assertions are separate; this specific raise is only for non-int non-list types.","commonSituations":"YAML/JSON config templating that renders numbers as strings; porting configs from other codebases that use tuples; forgetting that frame_range must be a plain int or list when writing custom video training configs.","solutions":["Use an int: frame_range=2, or a two-element list: frame_range=[-2, 2]","If the value comes from CLI/env/config file, cast it: frame_range=int(frame_range) or [int(v) for v in frame_range]","Remember the sign convention: first element <= 0, second >= 0 (offsets relative to the key frame)"],"exampleFix":"# before\nframe_sample = dict(type='FrameSampler', frame_range='[-2, 2]')\n# after\nframe_sample = dict(type='FrameSampler', frame_range=[-2, 2])","handlingStrategy":"type-guard","validationCode":"if isinstance(frame_range, str):\n    frame_range = eval(frame_range) if frame_range.startswith('[') else int(frame_range)\nassert isinstance(frame_range, (int, list))","typeGuard":"def is_valid_frame_range(fr) -> bool:\n    if isinstance(fr, int):\n        return True\n    return (isinstance(fr, list) and len(fr) == 2\n            and all(isinstance(i, int) for i in fr)\n            and fr[0] <= 0 <= fr[1])","tryCatchPattern":null,"preventionTips":["Write frame_range as int or [-n, n] list literal in configs, never a string/tuple","Cast values arriving from YAML templating before passing to the transform"],"tags":["mmdet","video","frame-sampling","typeerror","config"],"backgroundTag":"invalid-argument-type","analyzedSha":"cfd5d3a985b0249de009b67d04f37263e11cdf3d","analyzedAt":"2026-08-27T20:54:20.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}