我正在学习在python中使用位置参数,并试图在与默认参数混淆时看看它们是如何工作的: -
def withPositionalArgs(ae=9,*args):
print 'ae= ', ae
print 'args = ', args
a=1
b=2
c=[10,20]
withPositionalArgs(a,b,c)
Run Code Online (Sandbox Code Playgroud)
这给了我输出:
ae= 1
args = (2, [10, 20])
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,a被认为是传递一个值ae,并且b还有c被认为是位置参数.
所以,我现在想分配10的ae同时呼吁withPositionalArgs:
withPositionalArgs(ae=10,b,c)
Run Code Online (Sandbox Code Playgroud)
但是,我不能这样做.我收到错误:
SyntaxError: non-keyword arg after keyword arg
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我做得对吗?是否允许使用默认参数或在python函数中的位置参数之前使用一个好的做法?
class Singleton(type):
def __init__(self, *args, **kwargs):
print 'calling __init__ of Singleton class', self
print 'args: ', args
print 'kwargs: ', kwargs
super(Singleton, self).__init__(*args, **kwargs)
self.__instance = None
def __call__(self, *args, **kwargs):
print 'running __call__ of Singleton', self
print 'args: ', args
print 'kwargs: ', kwargs, '\n\n'
if self.__instance is None:
self.__instance = super(Singleton, self).__call__(*args, **kwargs)
return self.__instance
class A(object):
__metaclass__ = Singleton
def __init__(self,a):
print 'in __init__ of A: ', self
self.a = a
print 'self.a: ', self.a
a=A(10)
b=A(20) …Run Code Online (Sandbox Code Playgroud) 我试图理解内置sum()函数的工作,但是,start参数已经让我不知所措:
a=[[1, 20], [2, 3]]
b=[[[[[[1], 2], 3], 4], 5], 6]
>>> sum(b,a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
>>> sum(a,b)
[[[[[[1], 2], 3], 4], 5], 6, 1, 20, 2, 3]
Run Code Online (Sandbox Code Playgroud)>>> a=[1,2]
>>> b=[3,4]
>>> sum(a,b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
>>> sum(b,a)
Traceback (most recent …Run Code Online (Sandbox Code Playgroud)我试图让我的代码不接受关键字参数,就像一些bulitins也是不接受的关键字参数,但是,我不能这样做.在这里,根据我的有限理解,我的想法是: -
def somefunc(a,b):
print a,b
somefunc(10,20)
Run Code Online (Sandbox Code Playgroud)
输出:
10 20
Run Code Online (Sandbox Code Playgroud)
现在,当我运行以下内容时(我知道这不是函数定义中的关键字参数,但是,查看函数调用,它似乎与调用接受关键字参数的函数时的语法相同) :
somefunc(b=10,a=20)
Run Code Online (Sandbox Code Playgroud)
输出:
20 10
Run Code Online (Sandbox Code Playgroud)
我有两个问题: -
somefunc(b=10,a=20)而不是函数定义,这似乎是对只接受普通参数的函数的调用或接受关键字参数的函数.口译员如何区分两者?为什么我要这样做呢? 我只是在检查我是否可以这样做,所以我不会错过任何深入理解python的东西.我知道python是否允许这样做.
我正在阅读链接中描述符如何工作的解释:http://users.rcn.com/python/download/Descriptor.htm#properties.
但是,在这里,在类Property的__get__方法下,我对方法签名有疑问.方法签名是:
def __get__(self, obj, objtype=None):
在这里,我知道何时以及如何obj可以是无或实际对象.
但是,我不明白:在何种情况下可以objtype是None?而且,它在实际例子中是如何有用的.
阅读本文时:Python 中的元类是什么?,我正在学习使用__new__以下代码段:-
class a(object):
pass
a.__new__(int,'abcdef',(int,),{})
Run Code Online (Sandbox Code Playgroud)
调用__new__using可能存在一些问题a.。但是,我收到以下错误,我不明白其含义:-
TypeError: object.__new__(int) is not safe, use int.__new__()
如果与 的用法有关__new__,我可以通过阅读一些书籍来修改。但是,有人可以解释为什么会出现这条消息:
object.__new__(int) is not safe, use int.__new__()