In that case, it looks like you won't be able to get what you want without modifying CPython. PRINT_ITEM calls PyFile_SoftSpace, PyFile_WriteString, and PyFile_WriteObject, which all use PyFile_Check(). It might be as simple as changing these to PyFile_CheckExact() calls in PyFile_WriteString / PyFile_WriteObject, but I have no idea whether the test suite still works after this change is made. It does make this program work (it prints things from X.write):
class X(file):
def write(self, s):
print "X.write", `s`
return file.write(self, s)
import sys
x = X("/tmp/out.txt", "w")
print >>x, 42
I don't care to be the champion of this patch, or to submit it to
sourceforge; I suspect there should be a better review of PyFile_Check
vs PyFile_CheckExact uses in fileobject.c, instead of just picking the
few spots that make this usage work. Before being submitted as a patch,
a testcase should be added too. Feel free to run with this if you feel
strongly about it.
Jeff
Index: Objects/fileobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/fileobject.c,v
retrieving revision 2.193
diff -u -u -r2.193 fileobject.c
--- Objects/fileobject.c 7 Nov 2004 14:15:28 -0000 2.193
+++ Objects/fileobject.c 20 Apr 2005 02:41:32 -0000
@@ -2012,7 +2012,7 @@
PyErr_SetString(PyExc_TypeError, "writeobject with NULL file");
return -1;
}
- else if (PyFile_Check(f)) {
+ else if (PyFile_CheckExact(f)) {
FILE *fp = PyFile_AsFile(f);
#ifdef Py_USING_UNICODE
PyObject *enc = ((PyFileObject*)f)->f_encoding;
@@ -2082,7 +2082,7 @@
"null file for PyFile_WriteString");
return -1;
}
- else if (PyFile_Check(f)) {
+ else if (PyFile_CheckExact(f)) {
FILE *fp = PyFile_AsFile(f);
if (fp == NULL) {
err_closed();
pgpnLHNwKqjp4.pgp
Description: PGP signature
-- http://mail.python.org/mailman/listinfo/python-list
