Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果未找到参数,则在_init__;中引发异常_Python - Fatal编程技术网

Python 如果未找到参数,则在_init__;中引发异常

Python 如果未找到参数,则在_init__;中引发异常,python,Python,我有一个这样的结构: def __init__(self, my_param): if my_param: self.my_param = my_param else: raise MYException() 我在某处使用这个值,比如value=self.my_param 但是当我没有传递my_参数时,它不会引发异常,而是说类对象没有my_参数 我怎样才能正确地升高它?这应该可以工作 def __init__(self, my_param=No

我有一个这样的结构:

def __init__(self, my_param): 
    if my_param:
        self.my_param = my_param
    else:
        raise MYException()
我在某处使用这个值,比如
value=self.my_param

但是当我没有传递
my_参数
时,它不会引发异常,而是说
类对象没有my_参数

我怎样才能正确地升高它?

这应该可以工作

def __init__(self, my_param=None):
    if my_param:
        self.my_param = my_param
    else:
        raise MYException()

实际上,当您不向函数传递参数时,引发
TypeError
异常正是python本身所做的,我认为没有必要重写此异常:):

但您也可以使用
*args
将参数元组传递给构造函数,以检查
args
的有效性,如果您不传递任何内容,则会传递空元组:

class a(object):
    def __init__(self, *args):
        if args:
            self.param = args[0]
        else:
            raise Exception("Please pass a parameter to instance")
另外,作为一种实用而非pythonic的方法,您可以使用decorator包装您的构造函数:

def my_exp(func):
    def wrapper(*args, **kwds):
        if args:
            return func(*args)
        else:
            raise Exception("Pleas pass an argument to instance")
    return wrapper()

class a(object):
    @my_exp
    def __init__(self, my_param):
        self.param = my_param
演示:

instance = a()
Traceback (most recent call last):
  File "/home/kasra/Desktop/ex2.py", line 11, in <module>
    class a(object):
  File "/home/kasra/Desktop/ex2.py", line 12, in a
    @my_exp
  File "/home/kasra/Desktop/ex2.py", line 9, in my_exp
    return wrapper()
  File "/home/kasra/Desktop/ex2.py", line 8, in wrapper
    raise Exception("Pleas pass an argument to instance")
Exception: Pleas pass an argument to instance
instance=a()
回溯(最近一次呼叫最后一次):
文件“/home/kasra/Desktop/ex2.py”,第11行,在
a类(对象):
文件“/home/kasra/Desktop/ex2.py”,第12行,在
@我的经验
文件“/home/kasra/Desktop/ex2.py”,第9行,在my_exp中
返回包装器()
文件“/home/kasra/Desktop/ex2.py”,第8行,在包装器中
引发异常(“请将参数传递给实例”)
异常:请将参数传递给实例

您还可以使用其他工具,如
functools.wrapps
等,以创建更灵活的装饰器。但我仍然建议让python为您完成这项工作

为其指定一些默认值,例如
object()
,然后检查其值是否与默认值不同。您已经搞错了类定义。把整件事都贴出来。不要重新键入它,复制并粘贴确切的内容。请展示您如何实例化类和实际的回溯。按照您构建
\uuuu init\uuuu
方法的方式,
my\u param
不是可选的,因此它不可能无法传递。@aryan您也可以将
*args
传递给构造函数。签出编辑。
instance = a()
Traceback (most recent call last):
  File "/home/kasra/Desktop/ex2.py", line 11, in <module>
    class a(object):
  File "/home/kasra/Desktop/ex2.py", line 12, in a
    @my_exp
  File "/home/kasra/Desktop/ex2.py", line 9, in my_exp
    return wrapper()
  File "/home/kasra/Desktop/ex2.py", line 8, in wrapper
    raise Exception("Pleas pass an argument to instance")
Exception: Pleas pass an argument to instance