Tara Prasad Gurung
Tara Prasad Gurung

Reputation: 3559

Python error object() takes no parameters after upgrading python2.7 to python3.4

bashhostlist.py

from __future__ import print_function
import subprocess
import sys
import logging

class Singleton(object):
    """
    Creating a  single object that will work for all the plugin
    We create an object with an attrubute of the file path which is same for all the plugins
    So rather than creating new object for all the same object works so making singleton
    """
    _instance = None

    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance


class InventoryMgmt(Singleton): 
    hostlist = {'hostcontent':None}
    def __init__(self, path):
        """ bash file path where environement are set """
        self._scriptpath = path

The Singleton class is for singleton pattern.

Error type:

The error occurs in python version3.4 but not in python2.7

Error Log:

2017-11-03 03:09:39,187 - root - INFO - Plugin started
2017-11-03 03:09:39,187 - root - INFO - Trying to fetch from etc_shadow_plugin
2017-11-03 03:09:39,187 - root - ERROR - object() takes no parameters
Traceback (most recent call last):
  File "/home/sjoshi/python3.4/check-acess/plugins/plugin_etc_shadow/plugin_etc_shadow.py", line 91, in run
    listofhost=phelper.getallthehosts(hostnamewithoutdollar, envscriptpath)
  File "/home/sjoshi/python3.4/check-acess/lib/sshplugin/sshplugin.py", line 172, in getallthehosts
    myhosts=hostname.InventoryMgmt(envscriptpath)
  File "/home/sjoshi/python3.4/check-acess/lib/inventory/bashhostlist.py", line 16, in __new__
    class_._instance = object.__new__(class_, *args, **kwargs)

This is how I am making the call to the class

myhosts=hostname.InventoryMgmt(envscriptpath)

which is also clearly shown in the error message

Doubts:

Even though the init() method exists that takes one parameter why is it throwing that error. And most importantly the error was not there when it was run on python2.7

I have confirmed its not the tab and spacing problem, I saw many answers doubting on that problems so

Upvotes: 0

Views: 262

Answers (1)

georgexsh
georgexsh

Reputation: 16624

You should remove those extra arguments. In python2.7 if you pass extra arguments to object.__new__, a DeprecationWarning will be issued, but this warning has been suppressed by default, if you run your script with -Wdefault switch, you will see:

$ python2 -Wdefault singleton.py
singleton.py:13: DeprecationWarning: object() takes no parameters
  class_._instance = object.__new__(class_, *args, **kwargs)
<__main__.InventoryMgmt object at 0x106a2fd90> <__main__.InventoryMgmt object at 0x106a2fd90> True

Since python3.3 this warning was converted to an error.

Upvotes: 2

Related Questions