#include #include "python_ngcore.hpp" #include "array.hpp" #include "flags.hpp" #include "logging.hpp" namespace py = pybind11; using std::string; namespace ngcore { void SetFlag(Flags &flags, string s, py::object value) { if (py::isinstance(value)) { py::dict vdd(value); // call recursively to set dictionary for (auto item : vdd) { string name = item.first.cast(); py::object val = py::reinterpret_borrow(item.second); SetFlag(flags, name, val); } return; } if (py::isinstance(value)) flags.SetFlag(s, value.cast()); if (py::isinstance(value)) flags.SetFlag(s, value.cast()); if (py::isinstance(value)) flags.SetFlag(s, double(value.cast())); if (py::isinstance(value)) flags.SetFlag(s, value.cast()); if (py::isinstance(value)) { py::list vdl(value); if (py::len(vdl) > 0) { if(py::isinstance(vdl[0])) flags.SetFlag(s, makeCArray(vdl)); if(py::isinstance(vdl[0])) flags.SetFlag(s, makeCArray(vdl)); } else { Array dummystr; Array dummydbl; flags.SetFlag(s,dummystr); flags.SetFlag(s,dummydbl); } } if (py::isinstance(value)) { py::tuple vdt(value); if (py::isinstance(value)) flags.SetFlag(s, makeCArray(vdt)); if (py::isinstance(value)) flags.SetFlag(s, makeCArray(vdt)); if (py::isinstance(value)) flags.SetFlag(s, makeCArray(vdt)); } } Flags CreateFlagsFromKwArgs(py::object pyclass, const py::kwargs& kwargs, py::list info) { static std::shared_ptr logger = GetLogger("Flags"); auto flags_doc = pyclass.attr("__flags_doc__")(); py::dict flags_dict; if (kwargs.contains("flags")) { logger->warn("WARNING: using flags as kwarg is deprecated in {}, use the flag arguments as kwargs instead!", std::string(py::str(pyclass))); auto addflags = py::cast(kwargs["flags"]); for (auto item : addflags) flags_dict[item.first.cast().c_str()] = item.second; } for (auto item : kwargs) if (!flags_doc.contains(item.first.cast().c_str()) && !(item.first.cast() == "flags")) logger->warn("WARNING: kwarg '{}' is an undocumented flags option for class {}, maybe there is a typo?", item.first.cast(), std::string(py::str(pyclass))); py::dict special; if(py::hasattr(pyclass,"__special_treated_flags__")) special = pyclass.attr("__special_treated_flags__")(); for (auto item : kwargs) { auto name = item.first.cast(); if (name != "flags") { if(!special.contains(name.c_str())) flags_dict[name.c_str()] = item.second; } } auto flags = py::cast(flags_dict); for (auto item : kwargs) { auto name = item.first.cast(); if (name != "flags") { if(special.contains(name.c_str())) special[name.c_str()](item.second, &flags, info); } } return flags; } } // namespace ngcore