将python2.7升级到python3.4后,Python错误对象()不带任何参数

时间:2017-11-03 10:25:27

标签: python python-3.x singleton python-3.3

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

Singleton类用于单例模式

错误类型:

  

错误发生在python version3.4中,但不发生在python2.7中

错误日志:

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)

这就是我打电话给班级的方式

myhosts=hostname.InventoryMgmt(envscriptpath)

也清楚地显示在错误消息

疑惑:

  

即使存在 init ()方法,也需要一个参数   它抛出了这个错误。最重要的是错误不是   当它在python2.7上运行时

我已经确认它不是标签和间距问题,我看到许多答案怀疑这些问题,所以

1 个答案:

答案 0 :(得分:2)

你应该删除那些额外的参数。在python2.7中,如果您将额外的参数传递给object.__new__,则会发出DeprecationWarning,但是this warning has been suppressed by default,如果您使用-Wdefault开关运行脚本,您会看到:

$ 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

从python3.3开始,此警告已转换为错误。