From: Andres Corrada-E. <co...@ci...> - 2001-10-25 20:04:59
|
Hello, My problem has evolved to this thread. Let me recapitulate my intent: To create a Java class using Python code. The Python class subclasses from a class in some package "edu.umass.cs.ciir.metamorph". I compile the Python class to a .class file using jythonc with the package switch. The resultant .java file has the correct package declaration: package edu.umass.cs.ciir.metamorph; at the top of the file. My Python class tries to access a package-accesible super attribute but fails. If I make that attribute public it succeeds. This is unsatisfactory. I'm trying to use someone elses code and I cannot change the attribute properties. Can I still use Jython or do I need to abandon this line of approach and resign myself to having to program in Java directly? Andres Corrada-Emmanuel Senior Research Fellow Center for Intelligent Information Retrieval University of Massachusetts, Amherst |
From: Robert W. B. <rb...@di...> - 2001-10-25 20:41:54
|
On Thu, 25 Oct 2001, Andres Corrada-Emmanuel wrote: > Hello, > My problem has evolved to this thread. Let me recapitulate my intent: > > To create a Java class using Python code. The Python class subclasses from > a class in some package "edu.umass.cs.ciir.metamorph". > > I compile the Python class to a .class file using jythonc with the > package switch. The resultant .java file has the correct package > declaration: > > package edu.umass.cs.ciir.metamorph; > > at the top of the file. The package statement does not ensure that access occurs from this class. Creating 'dynamicism' means using indirection. Jython's indirection means that the attribute request may not originate in the class found in the generated .java file. > My Python class tries to access a package-accesible super attribute but > fails. If I make that attribute public it succeeds. This is > unsatisfactory. I'm trying to use someone elses code and I cannot change > the attribute properties. > > Can I still use Jython or do I need to abandon this line of approach and > resign myself to having to program in Java directly? Yes. You can set python.respectJavaAccessibility to false and use Jython. Even if you do not do so, you do not have to abandon Jython. Instead, write only a wrapper class in java that makes access Jython-friendly, then go about the project in Jython. -robert |
From: Andres Corrada-E. <co...@ci...> - 2001-10-26 01:03:15
|
Hi Robert, Thank you. I didn't know about the jython switch. I'd rather set the switch and avoid having to write wrapper classes. I was beginning to despair that Jython was not up to the task. This is awesome! Andres Corrada-Emmanuel Senior Research Fellow Center for Intelligent Information Retrieval University of Massachusetts, Amherst On Thu, 25 Oct 2001, Robert W. Bill wrote: > > The package statement does not ensure that access occurs from this class. > Creating 'dynamicism' means using indirection. Jython's indirection > means that the attribute request may not originate in the class found > in the generated .java file. > > > My Python class tries to access a package-accesible super attribute but > > fails. If I make that attribute public it succeeds. This is > > unsatisfactory. I'm trying to use someone elses code and I cannot change > > the attribute properties. > > > > Can I still use Jython or do I need to abandon this line of approach and > > resign myself to having to program in Java directly? > > Yes. You can set python.respectJavaAccessibility to false and use Jython. > Even if you do not do so, you do not have to abandon Jython. Instead, > write only a wrapper class in java that makes access > Jython-friendly, then go about the project in Jython. > > -robert > > |
From: Samuele P. <pe...@in...> - 2001-10-26 16:32:03
|
Andres Corrada-Emmanuel wrote: > I didn't know about the jython switch. I'd rather set the > switch and avoid having to write wrapper classes. I was beginning to > despair that Jython was not up to the task. This is awesome! > This is very newbie :) , without offense. I would not consider the python.respectJavaAccessibility option a production option, while handy it is more a testing option, in particular not a newbie option. It should be noted that under some security settings it will not work and in some applicative context it can cause security troubles ... Anyway in your case this could be just irrelevant, I'm lacking the context information to assess this. regards, Samuele Pedroni. |
From: Kevin B. <kb...@ca...> - 2001-10-25 22:27:21
|
You can do it just fine, but you have to set 'respectJavaAccessibility=false' in the jython registry (and this requires some permission in the Java VM - usually not a problem for Java applications, but applets may have problems). The reason that you still need to set this flag, even though you are generating code in the appropriate package , is that jythonc generates java code that uses the Python interpreter classes to do the method/attribute lookup. This means that the Python classes are trying to access the protected attribute, rather than the class that you generated. Example from my generated code, attempting to access the '_package' variable (package protected): Py.printComma(frame.getlocal(0).__getattr__("_package")); Note that it isn't doing the reflection itself, but is delegating to PyObject to do the reflection. My code & makefile attached below. kb ---Attribute.java package test; public class Attribute { private int _private = 1; int _package = 2; protected int _protected = 3; public int _public = 4; } ---testAttribute.py from test import Attribute class X( Attribute ): def go( self ): print self._package, self._private, self._protected, self._public X().go() ---Makefile testAttribute: javac -d . Attribute.java jythonc --package test testAttribute.py java -classpath .\;./jpywork\;w:/tools/jython/jython.jar test.testAttribute ---command: make testAttribute ---output: javac -d . Attribute.java jythonc --package test testAttribute.py processing testAttribute Required packages: test Creating adapters: Creating .java files: testAttribute module X extends test.Attribute Compiling .java to .class... Compiling with args: ['D:\\jdk1.3\\bin\\javac', '-classpath', '"w:/tools/jython/jython.jar;.;w:\\classes;w:\\lib\\ldapjdk.jar;w:\\lib\\xerces.jar;w:\\lib\\ldap.jar;w:\\lib\\providerutil.jar;w:\\lib\\jaas.jar;w:\\lib\\jndi.jar;w:\\lib\\ldapbp.jar;w:\\lib\\jsse-export\\jnet.jar;w:\\lib\\jsse-export\\jsse.jar;w:\\jars\\servlet.jar;w:\\;.\\jpywork;;w:\\tools\\jython\\Tools\\jythonc;e:\\work\\kb\\test\\jython\\.;w:\\tools\\jython\\Lib;w:\\src\\com\\pipeline\\test\\bom;w:\\src\\com\\pipeline\\test;d:\\python;w:\\tools\\jython"', '.\\jpywork\\test\\testAttribute.java'] 0 Note: Some input files use or override a deprecated API. Note: Recompile with -deprecation for details. java -classpath .\;./jpywork\;w:/tools/jython/jython.jar test.testAttribute 2 1 3 4 The '2 1 3 4' is the output of the command. It looks like it works to me - note that I have 'respectJavaAccessibility=false' in my jython registry. If I have 'respect...=true', I get: Java Traceback: at org.python.core.Py.AttributeError(Py.java:90) at org.python.core.PyObject.__getattr__(PyObject.java:692) at test.testAttribute$_PyInner.go$1(testAttribute.java:43) at test.testAttribute$_PyInner.call_function(testAttribute.java:32) at org.python.core.PyTableCode.call(PyTableCode.java:198) at org.python.core.PyTableCode.call(PyTableCode.java:253) at org.python.core.PyFunction.__call__(PyFunction.java:170) at org.python.core.PyInstance.invoke(PyInstance.java:236) at test.testAttribute$_PyInner.main$3(testAttribute.java:59) at test.testAttribute$_PyInner.call_function(testAttribute.java:36) at org.python.core.PyTableCode.call(PyTableCode.java:198) at org.python.core.PyCode.call(PyCode.java:13) at org.python.core.imp.createFromCode(imp.java:165) at org.python.core.Py.runMain(Py.java:818) at test.testAttribute.main(testAttribute.java:110) Traceback (innermost last): File "E:\work\kb\test\jython\testAttribute.py", line 0, in main File "E:\work\kb\test\jython\testAttribute.py", line 0, in go AttributeError: instance of 'X' has no attribute '_package' kb Andres Corrada-Emmanuel wrote: > > Hello, > > My problem has evolved to this thread. Let me recapitulate my intent: > > To create a Java class using Python code. The Python class subclasses from > a class in some package "edu.umass.cs.ciir.metamorph". > > I compile the Python class to a .class file using jythonc with the > package switch. The resultant .java file has the correct package > declaration: > > package edu.umass.cs.ciir.metamorph; > > at the top of the file. > > My Python class tries to access a package-accesible super attribute but > fails. If I make that attribute public it succeeds. This is > unsatisfactory. I'm trying to use someone elses code and I cannot change > the attribute properties. > > Can I still use Jython or do I need to abandon this line of approach and > resign myself to having to program in Java directly? > > Andres Corrada-Emmanuel > Senior Research Fellow > Center for Intelligent Information Retrieval > University of Massachusetts, Amherst > > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users |
From: Andres Corrada-E. <co...@ci...> - 2001-10-26 01:06:06
|
Hi Kevin, Thank you for the example code. It illustrates my confusion perfectly. I hope this sort of newbie mistake gets posted to the FAQ with your example solution. Andres Corrada-Emmanuel Senior Research Fellow Center for Intelligent Information Retrieval University of Massachusetts, Amherst On Thu, 25 Oct 2001, Kevin Butler wrote: > You can do it just fine, but you have to set 'respectJavaAccessibility=false' in the jython registry (and this requires some permission in the Java VM - usually not a problem for Java applications, but applets may have problems). > > The reason that you still need to set this flag, even though you are generating code in the appropriate package , is that jythonc generates java code that uses the Python interpreter classes to do the method/attribute lookup. This means that the Python classes are trying to access the protected attribute, rather than the class that you generated. > > Example from my generated code, attempting to access the '_package' variable (package protected): > > Py.printComma(frame.getlocal(0).__getattr__("_package")); > > Note that it isn't doing the reflection itself, but is delegating to PyObject to do the reflection. > > My code & makefile attached below. > > kb > > ---Attribute.java > package test; > > public class Attribute > { > private int _private = 1; > int _package = 2; > protected int _protected = 3; > public int _public = 4; > } > > > ---testAttribute.py > from test import Attribute > class X( Attribute ): > def go( self ): > print self._package, self._private, self._protected, self._public > > X().go() > > ---Makefile > testAttribute: > javac -d . Attribute.java > jythonc --package test testAttribute.py > java -classpath .\;./jpywork\;w:/tools/jython/jython.jar test.testAttribute > > ---command: > make testAttribute > > ---output: > javac -d . Attribute.java > jythonc --package test testAttribute.py > processing testAttribute > > Required packages: > test > > Creating adapters: > > Creating .java files: > testAttribute module > X extends test.Attribute > > Compiling .java to .class... > Compiling with args: ['D:\\jdk1.3\\bin\\javac', '-classpath', '"w:/tools/jython/jython.jar;.;w:\\classes;w:\\lib\\ldapjdk.jar;w:\\lib\\xerces.jar;w:\\lib\\ldap.jar;w:\\lib\\providerutil.jar;w:\\lib\\jaas.jar;w:\\lib\\jndi.jar;w:\\lib\\ldapbp.jar;w:\\lib\\jsse-export\\jnet.jar;w:\\lib\\jsse-export\\jsse.jar;w:\\jars\\servlet.jar;w:\\;.\\jpywork;;w:\\tools\\jython\\Tools\\jythonc;e:\\work\\kb\\test\\jython\\.;w:\\tools\\jython\\Lib;w:\\src\\com\\pipeline\\test\\bom;w:\\src\\com\\pipeline\\test;d:\\python;w:\\tools\\jython"', '.\\jpywork\\test\\testAttribute.java'] > 0 Note: Some input files use or override a deprecated API. > Note: Recompile with -deprecation for details. > > java -classpath .\;./jpywork\;w:/tools/jython/jython.jar test.testAttribute > 2 1 3 4 > > > The '2 1 3 4' is the output of the command. > > It looks like it works to me - note that I have 'respectJavaAccessibility=false' in my jython registry. > > If I have 'respect...=true', I get: > > Java Traceback: > > at org.python.core.Py.AttributeError(Py.java:90) > at org.python.core.PyObject.__getattr__(PyObject.java:692) > at test.testAttribute$_PyInner.go$1(testAttribute.java:43) > at test.testAttribute$_PyInner.call_function(testAttribute.java:32) > at org.python.core.PyTableCode.call(PyTableCode.java:198) > at org.python.core.PyTableCode.call(PyTableCode.java:253) > at org.python.core.PyFunction.__call__(PyFunction.java:170) > at org.python.core.PyInstance.invoke(PyInstance.java:236) > at test.testAttribute$_PyInner.main$3(testAttribute.java:59) > at test.testAttribute$_PyInner.call_function(testAttribute.java:36) > at org.python.core.PyTableCode.call(PyTableCode.java:198) > at org.python.core.PyCode.call(PyCode.java:13) > at org.python.core.imp.createFromCode(imp.java:165) > at org.python.core.Py.runMain(Py.java:818) > at test.testAttribute.main(testAttribute.java:110) > Traceback (innermost last): > File "E:\work\kb\test\jython\testAttribute.py", line 0, in main > File "E:\work\kb\test\jython\testAttribute.py", line 0, in go > AttributeError: instance of 'X' has no attribute '_package' > > kb > > Andres Corrada-Emmanuel wrote: > > > > Hello, > > > > My problem has evolved to this thread. Let me recapitulate my intent: > > > > To create a Java class using Python code. The Python class subclasses from > > a class in some package "edu.umass.cs.ciir.metamorph". > > > > I compile the Python class to a .class file using jythonc with the > > package switch. The resultant .java file has the correct package > > declaration: > > > > package edu.umass.cs.ciir.metamorph; > > > > at the top of the file. > > > > My Python class tries to access a package-accesible super attribute but > > fails. If I make that attribute public it succeeds. This is > > unsatisfactory. I'm trying to use someone elses code and I cannot change > > the attribute properties. > > > > Can I still use Jython or do I need to abandon this line of approach and > > resign myself to having to program in Java directly? > > > > Andres Corrada-Emmanuel > > Senior Research Fellow > > Center for Intelligent Information Retrieval > > University of Massachusetts, Amherst > > > > _______________________________________________ > > Jython-users mailing list > > Jyt...@li... > > https://lists.sourceforge.net/lists/listinfo/jython-users > |