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