Issue2546
Created on 2017-02-01.21:25:00 by stefan.richthofer, last changed 2018-03-12.23:24:02 by jeff.allen.
Messages | |||
---|---|---|---|
msg11056 (view) | Author: Stefan Richthofer (stefan.richthofer) | Date: 2017-02-01.21:25:00 | |
Declaring public static final PyString __doc__fieldName = Py.newString("blah"); seems not to add __doc__ to the field. Nor does @ExposedGet(name = "fieldName", doc = "blah") Not even a class-initializer (if field is PyObject-subclass) { fieldName.__setattr__("__doc__", Py.newString("blah")); } or using classDictInit does the trick. Is it possible at all? Even if it is somehow, there should be a more obvious way to do it. |
|||
msg11057 (view) | Author: Stefan Richthofer (stefan.richthofer) | Date: 2017-02-02.00:18:06 | |
So, I figured out what needs to be done to support something like public static final PyString __doc__fieldName = Py.newString("blah"); We would need to add a field to PyReflectedField: public PyObject __doc__ = null; In PyReflectedField.java append to _doget: PyObject result = Py.java2py(value); if (__doc__ != null) { try { result.__setattr__("__doc__", __doc__); } catch (PyException e) {} } return result; Finally some modification in PyJavaType is required: In init method change the part starting with for (Field field : fields) to the following: Map<String, CharSequence> doc_tmp = new HashMap<>(); for (Field field : fields) { if (!declaredOnMember(baseClass, field)) { continue; } String fldname = field.getName(); if (Modifier.isStatic(field.getModifiers())) { if (fldname.startsWith("__doc__") && fldname.length() > 7 && CharSequence.class.isAssignableFrom(field.getType())) { String fname = fldname.substring(7).intern(); PyObject memb = dict.__finditem__(fname); if (memb == null) { memb = dict.__finditem__(normalize(fname)); } if (memb != null) {// && memb instanceof PyReflectedFunction) { CharSequence doc = null; try { doc = (CharSequence) field.get(null); } catch (IllegalAccessException e) { throw Py.JavaError(e); } if (memb instanceof PyReflectedFunction) { ((PyReflectedFunction)memb).__doc__ = doc instanceof PyString ? (PyString) doc : new PyString(doc.toString()); } else if (memb instanceof PyReflectedField) { try { ((PyReflectedField)memb).__doc__ = doc instanceof PyString ? (PyString) doc : new PyString(doc.toString()); } catch (Exception e) { System.out.println(444+" "+e); } } } else { try { doc_tmp.put(normalize(fname), (CharSequence) field.get(null)); } catch (IllegalAccessException e) { throw Py.JavaError(e); } } } } if (dict.__finditem__(normalize(fldname)) == null) { PyReflectedField fld = new PyReflectedField(field); CharSequence doc = doc_tmp.get(normalize(fldname)); if (doc != null) fld.__doc__ = doc instanceof PyString ? (PyString) doc : new PyString(doc.toString()); dict.__setitem__(normalize(fldname), fld); } } If there are no concerns and tests go fine I'd be for adding this doc-feature. |
|||
msg11066 (view) | Author: Stefan Richthofer (stefan.richthofer) | Date: 2017-02-02.16:56:31 | |
The described approach fails if an object has read-only __doc__ attribute. E.g. for boolean fields. Anyway, adding __doc__ to the field-value isn't good if a value is shared between objects. Jython should better get the doc directly from the PyReflectedField-object if some_attribute.__doc__ is evaluated. Any suggestions how to achieve this? |
|||
msg11788 (view) | Author: Jeff Allen (jeff.allen) | Date: 2018-03-12.23:24:01 | |
Stefan: I may be misunderstanding what you are expecting. Searching for an example, I find: https://hg.python.org/jython/file/tip/src/org/python/modules/_io/PyFileIO.java#l63 It is true that my first attempts to have Jython produce that text were unsatisfactory: >>> import io >>> f = io.open('x.tmp', 'wb', buffering=0) >>> type(f) <type '_io.FileIO'> >>> help(f.mode) no Python documentation found for 'wb' But it actually appears when you ask for help on the FileIO object: >>> help(f) Help on FileIO object: class FileIO(_RawIOBase) | Method resolution order: | FileIO | _RawIOBase | _IOBase | __builtin__.object | | Methods defined here: ... | ---------------------------------------------------------------------- | Data descriptors defined here: | | closefd | True if the file descriptor will be closed | | mode | String giving the file mode: 'rb', 'rb+', or 'wb' | ... This is similar in CPython. |
History | |||
---|---|---|---|
Date | User | Action | Args |
2018-03-12 23:24:02 | jeff.allen | set | nosy:
+ jeff.allen messages: + msg11788 |
2017-02-02 16:56:32 | stefan.richthofer | set | messages: + msg11066 |
2017-02-02 00:18:07 | stefan.richthofer | set | messages: + msg11057 |
2017-02-01 21:25:00 | stefan.richthofer | create |
Supported by Python Software Foundation,
Powered by Roundup