Hi, Our tests recently caught a strange regression in our application. One can make existing scripts fail by changing an internal class to public.
The attached program reproduces the issue. The problem is that the method has optional parameters, but those are only declared at the interface. Now, when the class changes from “internal” to “public”, IronPython binds directly to the public methods without considering the interfaces any more, and thus does not recognize the optional parameters. Now, the question is whether this could be considered a bug in IronPython, or whether it should be considered a bug to implement an interface method without replicating the default parameter values… Best regards Markus Schaber CODESYS® a trademark of 3S-Smart Software Solutions GmbH Inspiring Automation Solutions ________________________________ 3S-Smart Software Solutions GmbH Dipl.-Inf. Markus Schaber | Product Development Core Technology Memminger Str. 151 | 87439 Kempten | Germany Tel. +49-831-54031-979 | Fax +49-831-54031-50 E-Mail: m.scha...@codesys.com<mailto:m.scha...@codesys.com> | Web: codesys.com<http://www.codesys.com> | CODESYS store: store.codesys.com<http://store.codesys.com> CODESYS forum: forum.codesys.com<http://forum.codesys.com> Managing Directors: Dipl.Inf. Dieter Hess, Dipl.Inf. Manfred Werner | Trade register: Kempten HRB 6186 | Tax ID No.: DE 167014915 ________________________________ This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace IronPythonInterfaceBindingTest { using IronPython.Hosting; public interface IFooBar { void DoSomething(int param, string text = null); } internal class InternalImpl : IFooBar { public void DoSomething(int param, string text) { Console.WriteLine("Internal: Param: {0} Text: {1}", param, text??"<null>"); } } public class PublicImpl : IFooBar { public void DoSomething(int param, string text) { Console.WriteLine("Public: Param: {0} Text: {1}", param, text ?? "<null>"); } } public static class Program { const string TESTSCRIPT = @" internalimpl.DoSomething(5, 'mit text') internalimpl.DoSomething(5) publicimpl.DoSomething(5, 'mit text') publicimpl.DoSomething(5) "; static void Main(string[] args) { try { var engine = Python.CreateEngine(); var scope = engine.CreateScope(); scope.SetVariable("internalimpl", new InternalImpl()); scope.SetVariable("publicimpl", new PublicImpl()); engine.Execute(TESTSCRIPT, scope); } catch (Exception ex) { Console.WriteLine(ex); } Console.ReadKey(); } } }
_______________________________________________ Ironpython-users mailing list Ironpython-users@python.org https://mail.python.org/mailman/listinfo/ironpython-users