TypeError: unbound method PrintInput() must be called with test instance as first argument (got test

Discussion in 'Python' started by arotem, Oct 16, 2005.

  1. arotem

    arotem Guest

    Hi,

    I am trying to call an unbound method (PrintInput) with the object
    instance as the first argument but getting the following error:
    "TypeError: unbound method PrintInput() must be called with test
    instance as first argument (got test instance instead)"

    Below is the sample code (test) for this purpose (two files).

    Any help is greatly appreciated.

    Thanks in Advance, Anat


    Sample Code:

    File 1 - input_file.py:

    #!/usr/bin/env python
    from test import *

    CMD = (test.PrintInput, float(2))

    File 2 - test.py:

    from input_file import *

    class test:
    def __init__(self):
    _test = 2
    def PrintInput(self, input):
    print "Input is = %s"%(input)

    if __name__== "__main__":
    print "Unit testing"
    inst = test()
    print CMD
    cmd = CMD[0]
    param = CMD[1:]

    cmd(inst,param) # this is the problematic line
    arotem, Oct 16, 2005
    #1
    1. Advertising

  2. Re: TypeError: unbound method PrintInput() must be called with testinstance as first argument (got test instance instead)

    arotem wrote:
    > Hi,
    >
    > I am trying to call an unbound method (PrintInput) with the object
    > instance as the first argument but getting the following error:
    > "TypeError: unbound method PrintInput() must be called with test
    > instance as first argument (got test instance instead)"
    >
    > Below is the sample code (test) for this purpose (two files).
    >
    > Any help is greatly appreciated.


    The problem is your circular import. When test.py is invoked, it imports
    input_file.py, which in turn imports test, creating a class bound to
    the name test.test. Then the rest of test is interpreted, creating a
    __main__.test. While both are based on the same code, they are two
    different instances of classes.

    To fix this, put your test-class in a separate module, and import that
    from both input_file.py and test.py

    Diez
    Diez B. Roggisch, Oct 16, 2005
    #2
    1. Advertising

  3. arotem

    Peter Otten Guest

    arotem wrote:

    > Hi,
    >
    > I am trying to call an unbound method (PrintInput) with the object
    > instance as the first argument but getting the following error:
    > "TypeError: unbound method PrintInput() must be called with test
    > instance as first argument (got test instance instead)"
    >
    > Below is the sample code (test) for this purpose (two files).
    >
    > Any help is greatly appreciated.
    >
    > Thanks in Advance, Anat
    >
    >
    > Sample Code:
    >
    > File 1 - input_file.py:
    >
    > #!/usr/bin/env python
    > from test import *
    >
    > CMD = (test.PrintInput, float(2))
    >
    > File 2 - test.py:
    >
    > from input_file import *
    >
    > class test:
    > def __init__(self):
    > _test = 2
    > def PrintInput(self, input):
    > print "Input is = %s"%(input)
    >
    > if __name__== "__main__":
    > print "Unit testing"
    > inst = test()
    > print CMD
    > cmd = CMD[0]
    > param = CMD[1:]
    >
    > cmd(inst,param) # this is the problematic line


    It is best to avoid situations where you import the main script into modules
    used by your program. You end up with to copies of (in your example)
    test.py. and therefore two functionally identical but distinct test classes
    and that gets you the error message. You can verify that with the following
    demo:

    #file script_is_main.py
    import script_is_main
    import __main__

    print script_is_main is __main__ # False

    A sound layout would instead be to move the test class into a separate
    module that is used by both the main script and the test module:

    # file test.py
    class Test:
    def __init__(self):
    _test = 2
    def PrintInput(self, input):
    print "Input is = %s"%(input)

    # file input_file.py
    import test

    CMD = (test.Test.PrintInput, float(2))

    # file main.py
    #!/usr/bin/env python
    import input_file
    import test

    if __name__== "__main__":
    print "Unit testing"
    inst = test.Test()
    CMD = input_file.CMD
    print CMD
    cmd = CMD[0]
    param = CMD[1:]

    cmd(inst, param) # this was the problematic line

    Peter
    Peter Otten, Oct 16, 2005
    #3
  4. arotem

    arotem Guest

    Thanks... it solves the problem :)
    arotem, Oct 17, 2005
    #4
  5. arotem

    arotem Guest

    Thanks... it solves the problem :)
    arotem, Oct 17, 2005
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page