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

时间:2015-09-25 20:16:04

标签: python tuples is-empty

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

可以使用以下代码完成此操作。

test.py:

#!/usr/bin/python
import Object

# Create an object
object = Object.Object()

# Try and access the "thing" attribute
object.thing

# Try and call the "thing" method
object.thing()

# Call the "thing" method with arguments
object.thing("arg1", "arg2")

Object.py:

class test(object):
"""Class for testing purposes!"""

    def __getattr__(self, name):
        """Handle undefined method calls!"""

        def __AUTOLOAD(*args):
            """Hack to simulate Perl's AUTOLOAD function."""

            # Do something with the args!
            return self.f(name, *args)
        return __AUTOLOAD

    # Simply print the args (as an example)
    def f(self, name, *args):
    """Do something with the args!"""

        print args
        return

输出:

>test.py
()
('arg1', 'arg2')

问题是,我只想让它适用于方法调用。如果它试图访问不存在的属性,我希望脚本抛出异常。

这意味着当我尝试访问""属性我想让它失败,但它应该适用于其他两种情况。

我认为可行的方法:

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

有没有办法在Python中捕获这个并在args变量为COMPLETELY为空并且不仅仅是空元组时引发异常?

3 个答案:

答案 0 :(得分:1)

作为一个hacky AUTOLOAD代理,您可以执行以下操作:

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}

答案 1 :(得分:0)

使用len(args)计算参数数量:

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

答案 2 :(得分:-1)

如果args完全为空,那么

args is None == True

所以你只需要比较

args == (). 

如果args是一个空元组,它将返回true,如果args为None,则返回false,因为

() is None == False