[Python.NET] changes to Python.Runtime.Converter and Python.Runtime.Object

Cameron Hayne <cameron.hayne-/[email protected]>
Newsgroups gmane.comp.python.dotnet
Message-ID <[email protected]>
I have been using the version of PythonDotNet from https://github.com/renshawbay/pythonnet
for embedding - i.e. to call Python code in C# programs.

I have made a few changes to the source code in order to make using Python objects in C# easier, or to fix problems.
Here are the changes:
1) In the source file “converter.cs” which defines the class Python.Runtime.Converter,
I added the following to the switch case ‘TypeCode.Object’ in the ‘ToPython’ function:

	case TypeCode.Object:
		// The following ‘if’ clause is needed (as suggested by Patrick Stewart) to make the examples in the README work.
		if (value is IEnumerable)
                {
                    using (var resultlist = new PyList())
                    {
                        foreach (object o in (IEnumerable)value)
                        {
                            Type oType = o.GetType();
                            TypeCode oTc = Type.GetTypeCode(oType);
                            //  The following 'if' clause for Object entries is needed so that the entries
                            //  in lists of Python objects don't lose their types.
                            //  I.e. so that if you do something like:
                            //     dynamic obj1 = myPythonClass();
                            //     List<dynamic> myList = new List<dynamic> { obj1 };
                            //     myPythonFunc(myList);
                            //  then the type of myList[0] inside myPythonFunc will be the same as the type of obj1
                            //  whereas the 'else' clause would make it be of type Python.Runtime.PyObject
                            if (oTc == TypeCode.Object)
                            {
                                resultlist.Append((PyObject)o);
                            }
                            else
                            {
                                using (var p = new PyObject(ToPython(o, oType)))
                                    resultlist.Append(p);
                            }
                        }
                        Runtime.Incref(resultlist.Handle);
                        return resultlist.Handle;
                    }
                }

2) In the source file “pyobject.cs” which defines the class Python.Runtime.PyObject,
I replaced the line:

	   this.SetAttr(binder.Name, (PyObject)value);

in the ‘if (this.HasAttr(binder.Name))’ clause in the function ‘TrySetMember’ with the following:

            //  Use ‘ToPython’ if an exception occurs when casting to (PyObject)
            //  Without this, get exception e.g. when assign a C# String to a Python member
            //  like:   myPyObj.name = name;
            PyObject pyValue;
            try
            {
                pyValue = (PyObject)value;
            }
            catch (Exception)
            {
                pyValue = value.ToPython();
            }
            this.SetAttr(binder.Name, pyValue);

I would be interested in any comments about these changes - especially if there are better ways of fixing the problems.
I am also interested to hear if anyone has other improvements to suggest.

--
Cameron Hayne
cameron.hayne-/[email protected]



_________________________________________________
Python.NET mailing list - [email protected]
https://mail.python.org/mailman/listinfo/pythondotnet
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.