diff --git a/derive/src/from_args.rs b/derive/src/from_args.rs index 6afb653de..aae3a18cd 100644 --- a/derive/src/from_args.rs +++ b/derive/src/from_args.rs @@ -18,9 +18,9 @@ enum ParameterKind { impl ParameterKind { fn from_ident(ident: &Ident) -> Option { match ident.to_string().as_str() { - "positional_only" => Some(ParameterKind::PositionalOnly), - "positional_or_keyword" => Some(ParameterKind::PositionalOrKeyword), - "keyword_only" => Some(ParameterKind::KeywordOnly), + "positional" => Some(ParameterKind::PositionalOnly), + "any" => Some(ParameterKind::PositionalOrKeyword), + "named" => Some(ParameterKind::KeywordOnly), "flatten" => Some(ParameterKind::Flatten), _ => None, } @@ -29,9 +29,10 @@ impl ParameterKind { struct ArgAttribute { kind: ParameterKind, - default: Option, - optional: bool, + default: Option, } +// None == quote!(Default::default()) +type DefaultValue = Option; impl ArgAttribute { fn from_attribute(attr: &Attribute) -> Option> { @@ -54,24 +55,19 @@ impl ArgAttribute { err_span!( first_arg, "The first argument to #[pyarg()] must be the parameter type, either \ - 'positional_only', 'positional_or_keyword', 'keyword_only', or 'flatten'." + 'positional', 'any', 'named', or 'flatten'." ) })?; let mut attribute = ArgAttribute { kind, default: None, - optional: false, }; for arg in iter { attribute.parse_argument(arg)?; } - if attribute.default.is_some() && attribute.optional { - bail_span!(attr, "Can't set both a default value and optional"); - } - Ok(attribute) } _ => bail_span!(attr, "pyarg must be a list, like #[pyarg(...)]"), @@ -85,43 +81,24 @@ impl ArgAttribute { } match arg { NestedMeta::Meta(Meta::Path(path)) => { - if path_eq(&path, "default") { - if self.default.is_some() { - bail_span!(path, "Default already set"); + if path_eq(&path, "default") || path_eq(&path, "optional") { + if self.default.is_none() { + self.default = Some(None); } - let expr = parse_quote!(Default::default()); - self.default = Some(expr); - } else if path_eq(&path, "optional") { - self.optional = true; } else { bail_span!(path, "Unrecognised pyarg attribute"); } } NestedMeta::Meta(Meta::NameValue(name_value)) => { if path_eq(&name_value.path, "default") { - if self.default.is_some() { + if matches!(self.default, Some(Some(_))) { bail_span!(name_value, "Default already set"); } match name_value.lit { - Lit::Str(ref val) => { - let expr = val.parse::().map_err(|_| { - err_span!(val, "Expected a valid expression for default argument") - })?; - self.default = Some(expr); - } + Lit::Str(ref val) => self.default = Some(Some(val.parse()?)), _ => bail_span!(name_value, "Expected string value for default argument"), } - } else if path_eq(&name_value.path, "optional") { - match name_value.lit { - Lit::Bool(ref val) => { - self.optional = val.value; - } - _ => bail_span!( - name_value.lit, - "Expected boolean value for optional argument" - ), - } } else { bail_span!(name_value, "Unrecognised pyarg attribute"); } @@ -143,7 +120,6 @@ fn generate_field(field: &Field) -> Result { ArgAttribute { kind: ParameterKind::PositionalOrKeyword, default: None, - optional: false, } } else if pyarg_attrs.len() == 1 { pyarg_attrs.remove(0) @@ -168,21 +144,18 @@ fn generate_field(field: &Field) -> Result { .map(|x| ::rustpython_vm::pyobject::TryFromObject::try_from_object(vm, x)).transpose()? }; let ending = if let Some(default) = attr.default { + let default = default.unwrap_or_else(|| parse_quote!(::std::default::Default::default())); quote! { + .map(::rustpython_vm::function::FromArgOptional::from_inner) .unwrap_or_else(|| #default) } - } else if attr.optional { - quote! { - .map(::rustpython_vm::function::OptionalArg::Present) - .unwrap_or(::rustpython_vm::function::OptionalArg::Missing) - } } else { let err = match attr.kind { ParameterKind::PositionalOnly | ParameterKind::PositionalOrKeyword => quote! { ::rustpython_vm::function::ArgumentError::TooFewArgs }, ParameterKind::KeywordOnly => quote! { - ::rustpython_vm::function::ArgumentError::RequiredKeywordArgument(tringify!(#name)) + ::rustpython_vm::function::ArgumentError::RequiredKeywordArgument(stringify!(#name)) }, ParameterKind::Flatten => unreachable!(), }; diff --git a/vm/src/anystr.rs b/vm/src/anystr.rs index 15083f9c2..1fbd0cf86 100644 --- a/vm/src/anystr.rs +++ b/vm/src/anystr.rs @@ -15,9 +15,9 @@ where S: ?Sized + AnyStr<'a, E>, E: Copy, { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] sep: Option, - #[pyarg(positional_or_keyword, default = "-1")] + #[pyarg(any, default = "-1")] maxsplit: isize, _phantom1: std::marker::PhantomData<&'a S>, _phantom2: std::marker::PhantomData, @@ -45,13 +45,13 @@ where #[derive(FromArgs)] pub struct SplitLinesArgs { - #[pyarg(positional_or_keyword, default = "false")] + #[pyarg(any, default = "false")] pub keepends: bool, } #[derive(FromArgs)] pub struct ExpandTabsArgs { - #[pyarg(positional_or_keyword, default = "8")] + #[pyarg(any, default = "8")] tabsize: isize, } @@ -63,11 +63,11 @@ impl ExpandTabsArgs { #[derive(FromArgs)] pub struct StartsEndsWithArgs { - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] affix: PyObjectRef, - #[pyarg(positional_only, default = "None")] + #[pyarg(positional, default)] start: Option, - #[pyarg(positional_only, default = "None")] + #[pyarg(positional, default)] end: Option, } diff --git a/vm/src/builtins.rs b/vm/src/builtins.rs index 025e44c73..bc48d5301 100644 --- a/vm/src/builtins.rs +++ b/vm/src/builtins.rs @@ -107,17 +107,17 @@ mod decl { #[derive(FromArgs)] #[allow(dead_code)] struct CompileArgs { - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] source: Either, - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] filename: PyStrRef, - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] mode: PyStrRef, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] flags: OptionalArg, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] dont_inherit: OptionalArg, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] optimize: OptionalArg, } @@ -188,10 +188,10 @@ mod decl { #[cfg(feature = "rustpython-compiler")] #[derive(FromArgs)] struct ScopeArgs { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] globals: Option, // TODO: support any mapping for `locals` - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] locals: Option, } @@ -669,13 +669,13 @@ mod decl { #[derive(Debug, Default, FromArgs)] pub struct PrintOptions { - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] sep: Option, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] end: Option, - #[pyarg(keyword_only, default = "IntoPyBool::FALSE")] + #[pyarg(named, default = "IntoPyBool::FALSE")] flush: IntoPyBool, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] file: Option, } diff --git a/vm/src/bytesinner.rs b/vm/src/bytesinner.rs index 1ec3c61ce..7348ae3dc 100644 --- a/vm/src/bytesinner.rs +++ b/vm/src/bytesinner.rs @@ -64,11 +64,11 @@ impl TryFromObject for PyBytesInner { #[derive(FromArgs)] pub struct ByteInnerNewOptions { - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] source: OptionalArg, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] encoding: OptionalArg, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] errors: OptionalArg, } @@ -155,11 +155,11 @@ impl ByteInnerNewOptions { #[derive(FromArgs)] pub struct ByteInnerFindOptions { - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] sub: Either, - #[pyarg(positional_only, default = "None")] + #[pyarg(positional, default)] start: Option, - #[pyarg(positional_only, default = "None")] + #[pyarg(positional, default)] end: Option, } @@ -180,9 +180,9 @@ impl ByteInnerFindOptions { #[derive(FromArgs)] pub struct ByteInnerPaddingOptions { - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] width: isize, - #[pyarg(positional_only, optional = true)] + #[pyarg(positional, optional)] fillchar: OptionalArg, } @@ -207,9 +207,9 @@ impl ByteInnerPaddingOptions { #[derive(FromArgs)] pub struct ByteInnerTranslateOptions { - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] table: Either, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] delete: OptionalArg, } @@ -1190,9 +1190,9 @@ impl<'s> AnyStr<'s, u8> for [u8] { #[derive(FromArgs)] pub struct DecodeArgs { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] encoding: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] errors: Option, } diff --git a/vm/src/function.rs b/vm/src/function.rs index 9fbb99ab6..1b7defe0b 100644 --- a/vm/src/function.rs +++ b/vm/src/function.rs @@ -244,6 +244,23 @@ pub trait FromArgs: Sized { fn from_args(vm: &VirtualMachine, args: &mut PyFuncArgs) -> Result; } +pub trait FromArgOptional { + type Inner: TryFromObject; + fn from_inner(x: Self::Inner) -> Self; +} +impl FromArgOptional for OptionalArg { + type Inner = T; + fn from_inner(x: T) -> Self { + Self::Present(x) + } +} +impl FromArgOptional for T { + type Inner = Self; + fn from_inner(x: Self) -> Self { + x + } +} + /// A map of keyword arguments to their values. /// /// A built-in function with a `KwArgs` parameter is analagous to a Python diff --git a/vm/src/obj/objcomplex.rs b/vm/src/obj/objcomplex.rs index b6b2785b1..786851995 100644 --- a/vm/src/obj/objcomplex.rs +++ b/vm/src/obj/objcomplex.rs @@ -308,9 +308,9 @@ impl Hashable for PyComplex { #[derive(FromArgs)] struct ComplexArgs { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] real: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] imag: Option, } diff --git a/vm/src/obj/objint.rs b/vm/src/obj/objint.rs index f2974a212..e96f9b1d7 100644 --- a/vm/src/obj/objint.rs +++ b/vm/src/obj/objint.rs @@ -691,29 +691,29 @@ impl Hashable for PyInt { #[derive(FromArgs)] struct IntOptions { - #[pyarg(positional_only, optional = true)] + #[pyarg(positional, optional)] val_options: OptionalArg, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] base: OptionalArg, } #[derive(FromArgs)] struct IntFromByteArgs { - #[pyarg(positional_or_keyword)] + #[pyarg(any)] bytes: PyBytesInner, - #[pyarg(positional_or_keyword)] + #[pyarg(any)] byteorder: PyStrRef, - #[pyarg(keyword_only, optional = true)] + #[pyarg(named, optional)] signed: OptionalArg, } #[derive(FromArgs)] struct IntToByteArgs { - #[pyarg(positional_or_keyword)] + #[pyarg(any)] length: PyIntRef, - #[pyarg(positional_or_keyword)] + #[pyarg(any)] byteorder: PyStrRef, - #[pyarg(keyword_only, optional = true)] + #[pyarg(named, optional)] signed: OptionalArg, } diff --git a/vm/src/obj/objlist.rs b/vm/src/obj/objlist.rs index abe64e0e0..7021cbb0b 100644 --- a/vm/src/obj/objlist.rs +++ b/vm/src/obj/objlist.rs @@ -95,9 +95,9 @@ impl PyList { #[derive(FromArgs, Default)] pub(crate) struct SortOptions { - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] key: Option, - #[pyarg(keyword_only, default = "false")] + #[pyarg(named, default = "false")] reverse: bool, } diff --git a/vm/src/obj/objproperty.rs b/vm/src/obj/objproperty.rs index 5d7aae1a8..846410826 100644 --- a/vm/src/obj/objproperty.rs +++ b/vm/src/obj/objproperty.rs @@ -61,13 +61,13 @@ pub type PyPropertyRef = PyRef; #[derive(FromArgs)] struct PropertyArgs { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] fget: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] fset: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] fdel: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] doc: Option, } diff --git a/vm/src/obj/objstr.rs b/vm/src/obj/objstr.rs index 7689e6ff3..780c3670a 100644 --- a/vm/src/obj/objstr.rs +++ b/vm/src/obj/objstr.rs @@ -168,11 +168,11 @@ impl PyStringReverseIterator { #[derive(FromArgs)] struct StrArgs { - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] object: OptionalArg, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] encoding: OptionalArg, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] errors: OptionalArg, } @@ -1072,9 +1072,9 @@ impl Comparable for PyStr { #[derive(FromArgs)] struct EncodeArgs { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] encoding: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] errors: Option, } @@ -1141,11 +1141,11 @@ type SplitArgs<'a> = anystr::SplitArgs<'a, PyStrRef, str, char>; #[derive(FromArgs)] pub struct FindArgs { - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] sub: PyStrRef, - #[pyarg(positional_only, default = "None")] + #[pyarg(positional, default)] start: Option, - #[pyarg(positional_only, default = "None")] + #[pyarg(positional, default)] end: Option, } diff --git a/vm/src/stdlib/binascii.rs b/vm/src/stdlib/binascii.rs index 9a4ef7918..3d028f137 100644 --- a/vm/src/stdlib/binascii.rs +++ b/vm/src/stdlib/binascii.rs @@ -114,7 +114,7 @@ mod decl { #[derive(FromArgs)] struct NewlineArg { - #[pyarg(keyword_only, default = "true")] + #[pyarg(named, default = "true")] newline: bool, } diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 49363863d..5514850f3 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -32,7 +32,7 @@ mod _collections { #[derive(FromArgs)] struct PyDequeOptions { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] maxlen: Option, } diff --git a/vm/src/stdlib/faulthandler.rs b/vm/src/stdlib/faulthandler.rs index 543c98361..257fd81e4 100644 --- a/vm/src/stdlib/faulthandler.rs +++ b/vm/src/stdlib/faulthandler.rs @@ -31,9 +31,9 @@ mod decl { #[derive(FromArgs)] #[allow(unused)] struct EnableArgs { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] file: Option, - #[pyarg(positional_or_keyword, default = "true")] + #[pyarg(any, default = "true")] all_threads: bool, } @@ -45,13 +45,13 @@ mod decl { #[derive(FromArgs)] #[allow(unused)] struct RegisterArgs { - #[pyarg(positional_only)] + #[pyarg(positional)] signum: i64, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] file: Option, - #[pyarg(positional_or_keyword, default = "true")] + #[pyarg(any, default = "true")] all_threads: bool, - #[pyarg(positional_or_keyword, default = "false")] + #[pyarg(any, default = "false")] chain: bool, } diff --git a/vm/src/stdlib/io.rs b/vm/src/stdlib/io.rs index 3fbf37af7..a4b0e9194 100644 --- a/vm/src/stdlib/io.rs +++ b/vm/src/stdlib/io.rs @@ -38,7 +38,7 @@ mod _io { pub(super) struct OptionalSize { // In a few functions, the default value is -1 rather than None. // Make sure the default value doesn't affect compatibility. - #[pyarg(positional_only, default = "None")] + #[pyarg(positional, default)] size: Option, } @@ -607,13 +607,13 @@ mod _io { #[derive(FromArgs)] struct TextIOWrapperArgs { - #[pyarg(positional_or_keyword, optional = false)] + #[pyarg(any)] buffer: PyObjectRef, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] encoding: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] errors: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] newline: Option, } @@ -795,7 +795,7 @@ mod _io { #[derive(FromArgs)] struct StringIOArgs { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] #[allow(dead_code)] // TODO: use this newline: Option, @@ -1133,17 +1133,17 @@ mod _io { #[derive(FromArgs)] #[allow(unused)] pub struct OpenArgs { - #[pyarg(positional_or_keyword, default = "-1")] + #[pyarg(any, default = "-1")] buffering: isize, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] encoding: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] errors: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] newline: Option, - #[pyarg(positional_or_keyword, default = "true")] + #[pyarg(any, default = "true")] closefd: bool, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] opener: Option, } impl Default for OpenArgs { @@ -1450,13 +1450,13 @@ mod fileio { #[derive(FromArgs)] struct FileIOArgs { - #[pyarg(positional_only)] + #[pyarg(positional)] name: Either, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] mode: Option, - #[pyarg(positional_or_keyword, default = "true")] + #[pyarg(any, default = "true")] closefd: bool, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] opener: Option, } diff --git a/vm/src/stdlib/itertools.rs b/vm/src/stdlib/itertools.rs index 79aef6edf..e4b919665 100644 --- a/vm/src/stdlib/itertools.rs +++ b/vm/src/stdlib/itertools.rs @@ -547,7 +547,7 @@ mod decl { #[derive(FromArgs)] struct GroupByArgs { iterable: PyObjectRef, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] key: OptionalOption, } @@ -1044,7 +1044,7 @@ mod decl { #[derive(FromArgs)] struct ProductArgs { - #[pyarg(keyword_only, optional = true)] + #[pyarg(named, optional)] repeat: OptionalArg, } @@ -1485,7 +1485,7 @@ mod decl { #[derive(FromArgs)] struct ZiplongestArgs { - #[pyarg(keyword_only, optional = true)] + #[pyarg(named, optional)] fillvalue: OptionalArg, } diff --git a/vm/src/stdlib/math.rs b/vm/src/stdlib/math.rs index c0eb1567d..77f424daf 100644 --- a/vm/src/stdlib/math.rs +++ b/vm/src/stdlib/math.rs @@ -47,13 +47,13 @@ make_math_func_bool!(math_isnan, is_nan); #[derive(FromArgs)] struct IsCloseArgs { - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] a: IntoPyFloat, - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] b: IntoPyFloat, - #[pyarg(keyword_only, optional = true)] + #[pyarg(named, optional)] rel_tol: OptionalArg, - #[pyarg(keyword_only, optional = true)] + #[pyarg(named, optional)] abs_tol: OptionalArg, } diff --git a/vm/src/stdlib/os.rs b/vm/src/stdlib/os.rs index 2c27cdc3f..19a0cc29b 100644 --- a/vm/src/stdlib/os.rs +++ b/vm/src/stdlib/os.rs @@ -198,19 +198,19 @@ pub fn errno_err(vm: &VirtualMachine) -> PyBaseExceptionRef { #[allow(dead_code)] #[derive(FromArgs, Default)] pub struct TargetIsDirectory { - #[pyarg(keyword_only, default = "false")] + #[pyarg(named, default = "false")] target_is_directory: bool, } #[derive(FromArgs, Default)] pub struct DirFd { - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] dir_fd: Option, } #[derive(FromArgs)] struct FollowSymlinks { - #[pyarg(keyword_only, default = "true")] + #[pyarg(named, default = "true")] follow_symlinks: bool, } @@ -769,11 +769,11 @@ mod _os { #[derive(FromArgs)] struct UtimeArgs { - #[pyarg(positional_or_keyword)] + #[pyarg(any)] path: PyPathLike, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] times: Option, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] ns: Option, #[pyarg(flatten)] _dir_fd: DirFd, @@ -1913,15 +1913,15 @@ mod posix { #[cfg(any(target_os = "linux", target_os = "freebsd", target_os = "macos"))] #[derive(FromArgs)] pub(super) struct PosixSpawnArgs { - #[pyarg(positional_only)] + #[pyarg(positional)] path: PyPathLike, - #[pyarg(positional_only)] + #[pyarg(positional)] args: PyIterable, - #[pyarg(positional_only)] + #[pyarg(positional)] env: PyMapping, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] file_actions: Option>, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] setsigdef: Option>, } diff --git a/vm/src/stdlib/posixsubprocess.rs b/vm/src/stdlib/posixsubprocess.rs index 8d5dd82b6..33cdfeccd 100644 --- a/vm/src/stdlib/posixsubprocess.rs +++ b/vm/src/stdlib/posixsubprocess.rs @@ -43,7 +43,7 @@ macro_rules! gen_args { ($($field:ident: $t:ty),*$(,)?) => { #[derive(FromArgs)] struct ForkExecArgs { - $(#[pyarg(positional_only)] $field: $t,)* + $(#[pyarg(positional)] $field: $t,)* } }; } diff --git a/vm/src/stdlib/pystruct.rs b/vm/src/stdlib/pystruct.rs index 0d48c0220..aaa3de87f 100644 --- a/vm/src/stdlib/pystruct.rs +++ b/vm/src/stdlib/pystruct.rs @@ -769,7 +769,7 @@ mod _struct { #[derive(FromArgs)] struct UpdateFromArgs { buffer: PyBytesLike, - #[pyarg(positional_or_keyword, default = "0")] + #[pyarg(any, default = "0")] offset: isize, } diff --git a/vm/src/stdlib/socket.rs b/vm/src/stdlib/socket.rs index 8e2720690..c426ae58f 100644 --- a/vm/src/stdlib/socket.rs +++ b/vm/src/stdlib/socket.rs @@ -500,18 +500,18 @@ fn socket_inet_ntoa(packed_ip: PyBytesRef, vm: &VirtualMachine) -> PyResult { #[derive(FromArgs)] struct GAIOptions { - #[pyarg(positional_only)] + #[pyarg(positional)] host: Option, - #[pyarg(positional_only)] + #[pyarg(positional)] port: Option>, - #[pyarg(positional_only, default = "0")] + #[pyarg(positional, default = "0")] family: i32, - #[pyarg(positional_only, default = "0")] + #[pyarg(positional, default = "0")] ty: i32, - #[pyarg(positional_only, default = "0")] + #[pyarg(positional, default = "0")] proto: i32, - #[pyarg(positional_only, default = "0")] + #[pyarg(positional, default = "0")] flags: i32, } diff --git a/vm/src/stdlib/ssl.rs b/vm/src/stdlib/ssl.rs index d68156c15..7bb3094e0 100644 --- a/vm/src/stdlib/ssl.rs +++ b/vm/src/stdlib/ssl.rs @@ -153,9 +153,9 @@ fn ssl_enum_certificates(store_name: PyStrRef, vm: &VirtualMachine) -> PyResult< #[derive(FromArgs)] struct Txt2ObjArgs { - #[pyarg(positional_or_keyword)] + #[pyarg(any)] txt: CString, - #[pyarg(positional_or_keyword, default = "false")] + #[pyarg(any, default = "false")] name: bool, } fn ssl_txt2obj(args: Txt2ObjArgs, vm: &VirtualMachine) -> PyResult { @@ -482,25 +482,25 @@ impl PySslContext { #[derive(FromArgs)] // #[allow(dead_code)] struct WrapSocketArgs { - #[pyarg(positional_or_keyword)] + #[pyarg(any)] sock: PySocketRef, - #[pyarg(positional_or_keyword)] + #[pyarg(any)] server_side: bool, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] server_hostname: Option, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] owner: Option, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] session: Option, } #[derive(FromArgs)] struct LoadVerifyLocationsArgs { - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] cafile: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] capath: Option, - #[pyarg(positional_or_keyword, default = "None")] + #[pyarg(any, default)] cadata: Option>, } diff --git a/vm/src/stdlib/thread.rs b/vm/src/stdlib/thread.rs index 7f2976cb9..f10a5c661 100644 --- a/vm/src/stdlib/thread.rs +++ b/vm/src/stdlib/thread.rs @@ -35,9 +35,9 @@ const TIMEOUT_MAX: f64 = (PY_TIMEOUT_MAX / 1_000_000) as f64; #[derive(FromArgs)] struct AcquireArgs { - #[pyarg(positional_or_keyword, default = "true")] + #[pyarg(any, default = "true")] blocking: bool, - #[pyarg(positional_or_keyword, default = "Either::A(-1.0)")] + #[pyarg(any, default = "Either::A(-1.0)")] timeout: Either, } diff --git a/vm/src/stdlib/warnings.rs b/vm/src/stdlib/warnings.rs index 9f0b78bd7..7fdce2648 100644 --- a/vm/src/stdlib/warnings.rs +++ b/vm/src/stdlib/warnings.rs @@ -10,11 +10,11 @@ mod _warnings { #[derive(FromArgs)] struct WarnArgs { - #[pyarg(positional_only, optional = false)] + #[pyarg(positional)] message: PyStrRef, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] category: OptionalArg, - #[pyarg(positional_or_keyword, optional = true)] + #[pyarg(any, optional)] stacklevel: OptionalArg, } diff --git a/vm/src/stdlib/winapi.rs b/vm/src/stdlib/winapi.rs index 3a8e2dfbe..053da7d86 100644 --- a/vm/src/stdlib/winapi.rs +++ b/vm/src/stdlib/winapi.rs @@ -106,23 +106,23 @@ fn _winapi_GetFileType(h: usize, vm: &VirtualMachine) -> PyResult { #[derive(FromArgs)] struct CreateProcessArgs { - #[pyarg(positional_only)] + #[pyarg(positional)] name: Option, - #[pyarg(positional_only)] + #[pyarg(positional)] command_line: Option, - #[pyarg(positional_only)] + #[pyarg(positional)] _proc_attrs: PyObjectRef, - #[pyarg(positional_only)] + #[pyarg(positional)] _thread_attrs: PyObjectRef, - #[pyarg(positional_only)] + #[pyarg(positional)] inherit_handles: i32, - #[pyarg(positional_only)] + #[pyarg(positional)] creation_flags: u32, - #[pyarg(positional_only)] + #[pyarg(positional)] env_mapping: Option, - #[pyarg(positional_only)] + #[pyarg(positional)] current_dir: Option, - #[pyarg(positional_only)] + #[pyarg(positional)] startup_info: PyObjectRef, } diff --git a/vm/src/stdlib/zlib.rs b/vm/src/stdlib/zlib.rs index a46e25bee..2aac33e0e 100644 --- a/vm/src/stdlib/zlib.rs +++ b/vm/src/stdlib/zlib.rs @@ -332,9 +332,9 @@ mod decl { #[derive(FromArgs)] struct DecompressArgs { - #[pyarg(positional_only)] + #[pyarg(positional)] data: PyBytesRef, - #[pyarg(positional_or_keyword, default = "0")] + #[pyarg(any, default = "0")] max_length: usize, } diff --git a/wasm/lib/src/browser_module.rs b/wasm/lib/src/browser_module.rs index 9a0e2ccba..3333cc9b0 100644 --- a/wasm/lib/src/browser_module.rs +++ b/wasm/lib/src/browser_module.rs @@ -42,15 +42,15 @@ impl FetchResponseFormat { #[derive(FromArgs)] struct FetchArgs { - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] response_format: Option, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] method: Option, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] headers: Option, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] body: Option, - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] content_type: Option, } diff --git a/wasm/lib/src/js_module.rs b/wasm/lib/src/js_module.rs index c7e9312df..fb2ed7031 100644 --- a/wasm/lib/src/js_module.rs +++ b/wasm/lib/src/js_module.rs @@ -231,13 +231,13 @@ impl PyJsValue { #[derive(FromArgs)] struct CallOptions { - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] this: Option, } #[derive(FromArgs)] struct NewObjectOptions { - #[pyarg(keyword_only, default = "None")] + #[pyarg(named, default)] prototype: Option, }