这件事现在让我误解了一段时间:
def test (*args, **kwargs):
print target
test(foo='bar', target='baz')
Run Code Online (Sandbox Code Playgroud)
我认为target='test'
在底部的aFunc调用最终会出现在kwargs中(并且确实如此),并且我还假设**会在函数调用中解包kwargs,因此target将作为aFunc中的关键字参数存在.它没有.我知道它作为一个dict出现,但我需要在参数列表中解压缩该dict.这可能吗?简而言之,有没有办法让*args和**kwargs消失并让实际的args和kwargs进入通话?
编辑:我汇总了一个案例,其中*args和**kwargs的解包可能会有所帮助:
假设我有一个打印列表的函数:
def printList (inputList=None):
print inputList
Run Code Online (Sandbox Code Playgroud)
我希望能够不传递任何列表并提供默认列表:
def ensureList (listFunc):
def wrapper (inputList=None):
listFunc(inputList=inputList or ['a','default','list'])
return wrapper
@ensureList
def printList (inputList=None):
print inputList
Run Code Online (Sandbox Code Playgroud)
现在我想让列表转发器变得更复杂:
@ensureList
def repeatList (inputList=None):
print inputList*2
Run Code Online (Sandbox Code Playgroud)
这很好.但现在我想要变量重复:
@ensureList
def repeatList (times, inputList=None):
print inputList*times
Run Code Online (Sandbox Code Playgroud)
现在你可以说:
repeatList(5)
Run Code Online (Sandbox Code Playgroud)
它会生成默认列表并重复5次.
当然,这会失败,因为包装器无法处理times参数.我当然可以这样做:
@ensureList
def repeatList (inputList=None, times=1)
Run Code Online (Sandbox Code Playgroud)
但后来我总是这样做:
repeatList(times=5)
Run Code Online (Sandbox Code Playgroud)
也许在某些情况下我想强制提供一个值,所以非关键字arg是有意义的.
当我去年第一次遇到这样的问题时,我认为一个简单的解决方案是删除包装器上的要求:
def ensureList (listFunc):
"info here re: operating on/requiring an inputList keyword arg"
def wrapper …
Run Code Online (Sandbox Code Playgroud) 我经常在分支上有多个分支,而这些分支都希望基于主线。考虑一下:
* (Mainline)
*
*
| * (topicA_Branch3)
| *
| *
| * (topicA_Branch2)
| *
| *
| * (topicA_Branch1)
| *
| *
|/
*
*
Run Code Online (Sandbox Code Playgroud)
我想将所有这三个topicA
分支移到主线上。目前,我知道执行此操作的两种方法:
开启后topicA_Branch3
,执行命令git rebase Mainline
。
一种。在这一点上,我将不得不删除topicA_Branch1
并2
手动重建现在rebased上正确提交的分支topicA_Branch3
。
另一种方法是执行三个单独的命令:
一种。继续时topicA_Branch1
,做git rebase Mainline
。
b。 git rebase --onto topicABranch1 <topicA_Branch1-old-SHA> topicABranch2
C。 git rebase --onto topicABranch2 <topicA_Branch2-old-SHA> topicABranch3
d。这有点麻烦...
我是否需要一个命令来重新建立分支并为其带来子分支?
需要明确的是,我想结束于此:
* (topicA_Branch3)
*
*
* (topicA_Branch2)
*
*
* …
Run Code Online (Sandbox Code Playgroud) 有一个未在vim帮助文件中列出的完成类型(特别是:insert.txt),但我本能地感觉到需要经常使用.假设我的文件中有"Awesome"和"SuperCrazyAwesome"字样.我发现Awesome的一个实例应该是SuperCrazyAwesome,所以我跳到单词的开头,进入插入模式,然后必须输入"SuperCrazy".
我觉得我应该可以键入"S",创建"SCrazy",然后只需点击一两个完成热键即可找到光标左侧的内容("S"),右侧是什么("疯狂" "),正则表达式反对文件中的所有单词("/ S\w*Crazy /"),并为我提供一个完成弹出菜单的选择,或者如果只有一个匹配就进行替换.
我想用这个实际的完成系统.存在使用函数的"用户定义"完成,并且在帮助替换给定列表方面具有良好示例.但是,我似乎无法追踪到实现这一目标所需要的许多细节,包括:
我已经在这几个小时了.我一直在努力达到死胡同,就像这个一样,它将我引入了\%#以匹配光标位置,这似乎对我不起作用.例如,搜索\ w*\%#只返回我所在单词的第一个字符,无论我在哪里.\%#似乎没有锚定.
项目树:
.
|-- bar.py
`-- test
|-- __init__.py
`-- test_bar.py
Run Code Online (Sandbox Code Playgroud)
bar.py:
def dumb_true():
return True
Run Code Online (Sandbox Code Playgroud)
测试/ test_bar.py:
import bar
def test_bar_true():
assert bar.dumb_true()
Run Code Online (Sandbox Code Playgroud)
我可以nosetests
从项目内部或其测试目录中运行.__init__.py
但是,如果我在项目文件夹中添加一个空,我就不能再nosetests
从test目录中运行了,这对我没有任何意义.
.
|-- bar.py
|-- __init__.py <-- new, empty file, ruining everything
`-- test
|-- __init__.py
`-- test_bar.py
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释这里发生了什么?
我已经在这个主题上广泛阅读 - 通过鼻子文档/手册页和整个互联网; 但是我觉得这一切都解决了,这看起来很混乱!
我一直试图让它与引用,引用拼接,评估以及我能想到的其他任何东西一起工作,但到目前为止还没有运气.我明白为什么它不工作-它被看作是一张地图,它试图EVAL a
,b
和c
-只是没有怎么去解决它.
(def destructor {a :a b :b c :c})
; CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(:1:15)
(let [destructor my-map]
'etc)
Run Code Online (Sandbox Code Playgroud)
我有一个相当复杂的解构图,我正在考虑使用几次,所以把它藏在某个地方似乎是个好主意.也许还有更好的方法可以解决这个问题?
我正在寻找像Lisp的arg-supplied-p变量一样的东西,以帮助区分默认值和用户指定的相同值.
例:
def foo(a=10):
pass
Run Code Online (Sandbox Code Playgroud)
我想在foo中知道它是否像这样调用:
foo()
Run Code Online (Sandbox Code Playgroud)
或者像这样:
foo(10)
Run Code Online (Sandbox Code Playgroud)
或者甚至喜欢这样:
foo(a=10)
Run Code Online (Sandbox Code Playgroud)
最后2个对我来说是同义词; 我不需要知道那个细节.我已经仔细查看了检查模块,但getargspec为所有3个调用返回的结果完全相同.
class A (object):
keywords = ('one', 'two', 'three')
class B (A):
keywords = A.keywords + ('four', 'five', 'six')
Run Code Online (Sandbox Code Playgroud)
有没有什么办法改变A.keywords
到<thing B derives from>.keywords
,有点像super()
,但预__init__/self
?我不喜欢在定义中重复类名.
用法:
>>> A.keywords
('one', 'two', 'three')
>>> B.keywords
('one', 'two', 'three', 'four', 'five', 'six')
Run Code Online (Sandbox Code Playgroud) 我还没有看过字典点访问的可切换版本.
我在这里的首次尝试不起作用:
class DottableDict (dict):
def allowDotting (self, state=True):
if state:
self.__setattr__ = dict.__setitem__
self.__getattr__ = dict.__getitem__
else:
del self.__setattr__
del self.__getattr__
>>> import dot
>>> d = dot.DottableDict()
>>> d.allowDotting()
>>> d.foo = 'bar'
>>> d
{}
>>> d.foo
'bar'
>>> d.__dict__
{'__setattr__': <slot wrapper '__setitem__' of 'dict' objects>, 'foo': 'bar',
'__getattr__': <method '__getitem__' of 'dict' objects>}
>>> d.allowDotting(False)
>>> d.__dict__
{'foo': 'bar'}
Run Code Online (Sandbox Code Playgroud)
我认为签名在setattr和setitem之间不匹配.
我的第二遍也似乎应该有效,但以同样的方式失败:
class DottableDict (dict):
def dotGet (self, attr):
return dict.__getitem__(self, attr)
def dotSet (self, attr, …
Run Code Online (Sandbox Code Playgroud) 示例 - 任何bash关键字(例如else
或in
)也会导致:
$ python -c 'import sys;for p in sys.path:print p'
File "<string>", line 1
import sys;for p in sys.path:print p
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
双引号无法修复它.
我正在尝试制作斐波那契数列,但我不明白为什么会这样:
def fibonacci(n):
f1 = 0
f2 = 1
i = 1
while i < n:
print(f2)
f1 = f2
f2 = f1 + f2
i += 1
return f3
Run Code Online (Sandbox Code Playgroud)
返回 1, 2, 4, 8,而:
def fibonacci(n):
f1 = 0
f2 = 1
i = 1
while i < n:
print(f2)
f1, f2 = f2, f1 + f2
i += 1
return f3
Run Code Online (Sandbox Code Playgroud)
返回斐波那契数列。
是否可以执行类的实例?我不是指实例化一个类,或者执行一个方法.我的意思是__string__的兄弟会返回一个函数.我们称之为__func__.
class ClassFunc (object):
def __func__ (self):
print "I'm a class!"
>>> myCF = ClassFunc()
>>> myCF()
I'm a class!
Run Code Online (Sandbox Code Playgroud)