MCPcopy Index your code
hub / github.com/RustPython/RustPython / subs_parameters

Function subs_parameters

crates/vm/src/builtins/genericalias.rs:449–565  ·  view source on GitHub ↗

_Py_subs_parameters

(
    alias: PyObjectRef, // = self
    args: PyTupleRef,
    parameters: PyTupleRef,
    item: PyObjectRef,
    vm: &VirtualMachine,
)

Source from the content-addressed store, hash-verified

447
448// _Py_subs_parameters
449pub fn subs_parameters(
450 alias: PyObjectRef, // = self
451 args: PyTupleRef,
452 parameters: PyTupleRef,
453 item: PyObjectRef,
454 vm: &VirtualMachine,
455) -> PyResult<PyTupleRef> {
456 let n_params = parameters.len();
457 if n_params == 0 {
458 return Err(vm.new_type_error(format!("{} is not a generic class", alias.repr(vm)?)));
459 }
460
461 // Step 1: Unpack args
462 let mut item: PyObjectRef = unpack_args(item, vm)?.into();
463
464 // Step 2: Call __typing_prepare_subst__ on each parameter
465 for param in parameters.iter() {
466 if let Ok(prepare) = param.get_attr(identifier!(vm, __typing_prepare_subst__), vm)
467 && !prepare.is(&vm.ctx.none)
468 {
469 // Call prepare(self, item)
470 item = if item.try_to_ref::<PyTuple>(vm).is_ok() {
471 prepare.call((alias.clone(), item.clone()), vm)?
472 } else {
473 // Create a tuple with the single item's "O(O)" format
474 let tuple_args = PyTuple::new_ref(vec![item.clone()], &vm.ctx);
475 prepare.call((alias.clone(), tuple_args.to_pyobject(vm)), vm)?
476 };
477 }
478 }
479
480 // Step 3: Extract final arg items
481 let arg_items = if let Ok(tuple) = item.try_to_ref::<PyTuple>(vm) {
482 tuple.as_slice().to_vec()
483 } else {
484 vec![item.clone()]
485 };
486 let n_items = arg_items.len();
487
488 if n_items != n_params {
489 return Err(vm.new_type_error(format!(
490 "Too {} arguments for {}; actual {}, expected {}",
491 if n_items > n_params { "many" } else { "few" },
492 alias.repr(vm)?,
493 n_items,
494 n_params
495 )));
496 }
497
498 // Step 4: Replace all type variables
499 let mut new_args = Vec::new();
500
501 for arg in args.iter() {
502 // Skip PyType objects
503 if arg.class().is(vm.ctx.types.type_type) {
504 new_args.push(arg.clone());
505 continue;
506 }

Callers 2

getitemMethod · 0.85
__getitem__Method · 0.85

Calls 15

unpack_argsFunction · 0.85
newFunction · 0.85
is_unpacked_typevartupleFunction · 0.85
tuple_indexFunction · 0.85
subs_tvarsFunction · 0.85
isMethod · 0.80
to_vecMethod · 0.80
borrow_vecMethod · 0.80
ErrClass · 0.50
lenMethod · 0.45
iterMethod · 0.45
get_attrMethod · 0.45

Tested by

no test coverage detected