Merge pull request #3585 from dieterplex/fixtestuserdict

Fix dict.fromkeys to return correct type
This commit is contained in:
Jeong YunWon
2022-03-30 11:59:44 +09:00
committed by GitHub
2 changed files with 18 additions and 11 deletions

View File

@@ -212,8 +212,6 @@ class DictTest(unittest.TestCase):
self.assertRaises(ValueError, {}.update, [(1, 2, 3)])
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_fromkeys(self):
self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None})
d = {}

View File

@@ -1,6 +1,6 @@
use super::{
set::PySetInner, IterStatus, PositionIterInternal, PyBaseExceptionRef, PyGenericAlias, PySet,
PyStrRef, PyTupleRef, PyTypeRef,
PyStrRef, PyTupleRef, PyType, PyTypeRef,
};
use crate::{
builtins::{iter::builtins_iter, PyTuple},
@@ -9,8 +9,8 @@ use crate::{
function::{ArgIterable, FuncArgs, IntoPyObject, KwArgs, OptionalArg},
protocol::{PyIterIter, PyIterReturn, PyMappingMethods, PySequenceMethods},
types::{
AsMapping, AsSequence, Comparable, Constructor, Hashable, IterNext, IterNextIterable,
Iterable, PyComparisonOp, Unconstructible, Unhashable,
AsMapping, AsSequence, Callable, Comparable, Constructor, Hashable, IterNext,
IterNextIterable, Iterable, PyComparisonOp, Unconstructible, Unhashable,
},
vm::{ReprGuard, VirtualMachine},
IdProtocol,
@@ -150,14 +150,23 @@ impl PyDict {
iterable: ArgIterable,
value: OptionalArg<PyObjectRef>,
vm: &VirtualMachine,
) -> PyResult<PyRef<Self>> {
let dict = DictContentType::default();
) -> PyResult {
let value = value.unwrap_or_none(vm);
for elem in iterable.iter(vm)? {
let elem = elem?;
dict.insert(vm, elem, value.clone())?;
let d = PyType::call(&class, ().into(), vm)?;
match d.downcast_exact::<PyDict>(vm) {
Ok(pydict) => {
for key in iterable.iter(vm)? {
pydict.setitem(key?, value.clone(), vm)?;
}
Ok(pydict.into_pyobject(vm))
}
Err(pyobj) => {
for key in iterable.iter(vm)? {
pyobj.set_item(key?, value.clone(), vm)?;
}
Ok(pyobj)
}
}
PyDict { entries: dict }.into_ref_with_type(vm, class)
}
#[pymethod(magic)]