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

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • arotem

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

    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.PrintInpu t, 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

  • Diez B. Roggisch

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

    arotem wrote:[color=blue]
    > 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.[/color]

    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

    Comment

    • Peter Otten

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

      arotem wrote:
      [color=blue]
      > 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.PrintInpu t, 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[/color]

      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.Prin tInput, 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

      Comment

      • arotem

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

        Thanks... it solves the problem :-)

        Comment

        • arotem

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

          Thanks... it solves the problem :-)

          Comment

          Working...