Skip to content

Commit 2723336

Browse files
Add init for array.rs (RustPython#4667)
1 parent 685532d commit 2723336

File tree

3 files changed

+16
-5
lines changed

3 files changed

+16
-5
lines changed

Lib/test/test_array.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,8 +1114,6 @@ def test_bug_782369(self):
11141114
b = array.array('B', range(64))
11151115
self.assertEqual(rc, sys.getrefcount(10))
11161116

1117-
# TODO: RUSTPYTHON
1118-
@unittest.expectedFailure
11191117
def test_subclass_with_kwargs(self):
11201118
# SF bug #1486663 -- this used to erroneously raise a TypeError
11211119
ArraySubclassWithKwargs('b', newarg=1)

stdlib/src/array.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ mod array {
4646
},
4747
class_or_notimplemented,
4848
convert::{ToPyObject, ToPyResult, TryFromObject},
49-
function::{ArgBytesLike, ArgIntoFloat, ArgIterable, OptionalArg, PyComparisonValue},
49+
function::{
50+
ArgBytesLike, ArgIntoFloat, ArgIterable, KwArgs, OptionalArg, PyComparisonValue,
51+
},
5052
protocol::{
5153
BufferDescriptor, BufferMethods, BufferResizeGuard, PyBuffer, PyIterReturn,
5254
PyMappingMethods, PySequenceMethods,
@@ -644,18 +646,25 @@ mod array {
644646
}
645647

646648
impl Constructor for PyArray {
647-
type Args = ArrayNewArgs;
649+
type Args = (ArrayNewArgs, KwArgs);
648650

649651
fn py_new(
650652
cls: PyTypeRef,
651-
Self::Args { spec, init }: Self::Args,
653+
(ArrayNewArgs { spec, init }, kwargs): Self::Args,
652654
vm: &VirtualMachine,
653655
) -> PyResult {
654656
let spec = spec.as_str().chars().exactly_one().map_err(|_| {
655657
vm.new_type_error(
656658
"array() argument 1 must be a unicode character, not str".to_owned(),
657659
)
658660
})?;
661+
662+
if cls.is(PyArray::class(vm)) && !kwargs.is_empty() {
663+
return Err(
664+
vm.new_type_error("array.array() takes no keyword arguments".to_owned())
665+
);
666+
}
667+
659668
let mut array =
660669
ArrayContentType::from_char(spec).map_err(|err| vm.new_value_error(err))?;
661670

vm/src/function/argument.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,10 @@ impl<T> KwArgs<T> {
328328
pub fn pop_kwarg(&mut self, name: &str) -> Option<T> {
329329
self.0.remove(name)
330330
}
331+
332+
pub fn is_empty(self) -> bool {
333+
self.0.is_empty()
334+
}
331335
}
332336
impl<T> FromIterator<(String, T)> for KwArgs<T> {
333337
fn from_iter<I: IntoIterator<Item = (String, T)>>(iter: I) -> Self {

0 commit comments

Comments
 (0)