Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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/4/wpf/14.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,区分空元组和完全空变量_Python_Tuples_Is Empty - Fatal编程技术网

Python,区分空元组和完全空变量

Python,区分空元组和完全空变量,python,tuples,is-empty,Python,Tuples,Is Empty,我试图使用来处理对象上未定义的方法调用。我希望最终结果与Perl中的函数非常相似 这可以通过以下代码完成 test.py: Object.py: 输出: 问题是,我只希望它对方法调用有效。如果它试图访问一个不存在的属性,我希望脚本抛出一个异常 这意味着,当我尝试访问thing属性时,我希望它失败,但在其他两种情况下它应该可以工作 我认为可行的方法是: 如果我能为Python找到一种区分空变量和完全空变量的方法,这可能是可行的。如您所见,object.thing调用没有打印任何内容,因为args变

我试图使用来处理对象上未定义的方法调用。我希望最终结果与Perl中的函数非常相似

这可以通过以下代码完成

test.py:

Object.py:

输出:

问题是,我只希望它对方法调用有效。如果它试图访问一个不存在的属性,我希望脚本抛出一个异常

这意味着,当我尝试访问thing属性时,我希望它失败,但在其他两种情况下它应该可以工作

我认为可行的方法是: 如果我能为Python找到一种区分空变量和完全空变量的方法,这可能是可行的。如您所见,object.thing调用没有打印任何内容,因为args变量不包含任何内容


在Python中,如果args变量完全为空,而不仅仅是一个空元组,那么有没有办法捕捉到这一点并引发异常?

如果args完全为空,那么

args is None == True
所以你只需要比较一下

args == (). 
如果args为空元组,则返回true;如果args为无,则返回false,因为

() is None == False
使用lenargs计算参数的数量:

def f(self, name, *args):
    if len(args) == 0:
        print "No args"
    else:
        print "%d args" % len(args)

作为黑客自动加载代理,您可以执行以下操作:

class Thing(object):
    def __init__(self, default):
        self.default = default

    def __getattr__(self, name):
        try:
            return getattr(self.default, name)
        except AttributeError:
            return self.default    
然后使用类似于:

首先定义一个默认函数:

>>> def auto(*args, **kwargs):
>>>     print 'default', args, kwargs
然后:


你的前提是错误的。object.thing是对方法的引用,但实际上并不调用object.thing。这就是它没有打印任何内容的原因。稍微不直观的错误内容列表:。这就是为什么在Python中会听到False-ish或类似于False的声音?这是pythonalso,也许你应该看看inspect模块。它有isclass、ismethod和许多其他用于内省@Apero的有用工具,我试图用Python编写一个WinCVS API,而不是定义每个CVS函数,如果我定义一个简单的自动加载例程将未识别的方法传递给CVS,我甚至不知道它们都是什么。这样做将允许API处理任何CVS命令,并允许CVS本身处理任何错误处理。尝试并定义所有单个CVS命令将是一种完全过火的行为。更惯用的表达式是args is None。不过我希望它在没有args的情况下工作,所以这也不起作用。基本上,我想要一种方法来区分object.thing和object.thing。。。object.thing应该失败,而object.thing应该调用_AUTOLOAD,然后fobject.thing不调用该方法,它只是返回对它的引用:foo=object.thing;福
def f(self, name, *args):
    if len(args) == 0:
        print "No args"
    else:
        print "%d args" % len(args)
class Thing(object):
    def __init__(self, default):
        self.default = default

    def __getattr__(self, name):
        try:
            return getattr(self.default, name)
        except AttributeError:
            return self.default    
>>> def auto(*args, **kwargs):
>>>     print 'default', args, kwargs
>>> Thing(auto).not_defined()
default () {}
>>> Thing(auto).not_defined(123)
default (123,) {}
>>> Thing(auto).not_defined(123, mu=345)
default (123,) {'mu': 345}