[Tutor] TypeError when io.open is used
Steven D'Aprano
steve at pearwood.info
Mon Jun 28 01:51:50 CEST 2010
On Mon, 28 Jun 2010 08:20:01 am petkovas at dir.bg wrote:
> The full error message is:
>
> Traceback <most recent call last>:
> File "insert_into_db_v9.py", line 55, in <module>
> WHERE testtable_n = %s""", data1,
> str(os.path.splitext(file)[0]))
> TypeError: an integer is required
Unfortunately this isn't helpful, because we're only seeing part of the
offending line of code. This is because Python tracebacks only show the
*physical* line which fails, but a logical line of code can be split
over more than one physical line.
E.g. if I have a module like this:
# test.py
x = 23
y = 23-x
z = (42/
y)
and then import it:
>>> import test
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 5, in <module>
y)
ZeroDivisionError: integer division or modulo by zero
it only shows me the last part of the expression (42/y).
So you will need to look at your source code and manually copy and paste
the rest of the logical line, that is, the line or lines immediately
before line 55.
> And i would want to add that str() is not the problem. I have tried
> without it and the problem persisted.
The call to str() is totally pointless, since os.path.splitext(file)[0]
is already a string.
[...]
> file = open(
> "C:\\Blender_Library\\BlenderLib\\objectLib\\Faqns\\Osaka2\\faqns_osa
>ka_2.jpg", "rb" )
Windows accepts forwards slashes for pathnames too, so the above can
more simply be written:
"C:/Blender_Library/BlenderLib/objectLib/Faqns/Osaka2/faqns_osaka_2.jpg"
with less chance of error.
> The problem this time was:
> Traceback <most recent call last>:
> File "insertdb_pg8000.py", line 19, in <module>
> cursor.execute("UPDATE testtable SET jpeg = %s WHERE
> testtable_n = %s", data1, data2)
> File "build\bdist.win32\egg\pg8000\dbapi.py", line 243, in _fn
> TypeError: execute() takes at most 3 arguments (4 given)
I'm afraid this is an example of a *slightly* misleading error message
in Python. the cursor.execute method takes at most three arguments:
# Something like this.
class Cursor:
def execute(self, a, b):
pass
*but* one of those arguments, self, is automatically filled in by
Python. So when you call execute, you can only supply TWO arguments:
cursor.execute(a, b)
If you provide three:
cmd = "UPDATE testtable SET jpeg = %s WHERE testtable_n = %s"
cursor.execute(cmd, data1, data2)
then Python fills in self and gives an error message that execute takes
only three arguments, not four.
So you need to read the documentation for execute to find out what
arguments it takes, because you can't pass all three of cmd, data1 and
data2.
--
Steven D'Aprano
More information about the Tutor
mailing list