小编Gar*_*ler的帖子

为什么不在函数调用中解压缩kwargs?

这件事现在让我误解了一段时间:

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)

python arguments kwargs

6
推荐指数
1
解决办法
4675
查看次数

一次将分支机构重新分支到一个分支

我经常在分支上有多个分支,而这些分支都希望基于主线。考虑一下:

* (Mainline)
*
*
| * (topicA_Branch3)
| *
| *
| * (topicA_Branch2)
| *
| *
| * (topicA_Branch1)
| *
| *
|/
*
*
Run Code Online (Sandbox Code Playgroud)

我想将所有这三个topicA分支移到主线上。目前,我知道执行此操作的两种方法:

  1. 开启后topicA_Branch3,执行命令git rebase Mainline

    一种。在这一点上,我将不得不删除topicA_Branch12手动重建现在rebased上正确提交的分支topicA_Branch3

  2. 另一种方法是执行三个单独的命令:

    一种。继续时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)

git rebase

6
推荐指数
1
解决办法
686
查看次数

vim内部代码完成

有一个未在vim帮助文件中列出的完成类型(特别是:insert.txt),但我本能地感觉到需要经常使用.假设我的文件中有"Awesome"和"SuperCrazyAwesome"字样.我发现Awesome的一个实例应该是SuperCrazyAwesome,所以我跳到单词的开头,进入插入模式,然后必须输入"SuperCrazy".

我觉得我应该可以键入"S",创建"SCrazy",然后只需点击一两个完成热键即可找到光标左侧的内容("S"),右侧是什么("疯狂" "),正则表达式反对文件中的所有单词("/ S\w*Crazy /"),并为我提供一个完成弹出菜单的选择,或者如果只有一个匹配就进行替换.

我想用这个实际的完成系统.存在使用函数的"用户定义"完成,并且在帮助替换给定列表方面具有良好示例.但是,我似乎无法追踪到实现这一目标所需要的许多细节,包括:

  1. 如何从vim函数获取文件中所有单词的列表?
  2. 我可以列出所有缓冲区中的单词(带文件名),因为vim完整吗?
  3. 如何在插入模式下获取光标前/后单词中的文本?
  4. 完成可以替换整个单词,而不仅仅是光标吗?

我已经在这几个小时了.我一直在努力达到死胡同,就像这个一样,它将我引入了\%#以匹配光标位置,这似乎对我不起作用.例如,搜索\ w*\%#只返回我所在单词的第一个字符,无论我在哪里.\%#似乎没有锚定.

regex vim code-completion

5
推荐指数
1
解决办法
381
查看次数

项目文件夹中的__init__.py会破坏鼻子测试

项目树:

.
|-- 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)

任何人都可以向我解释这里发生了什么?

我已经在这个主题上广泛阅读 - 通过鼻子文档/手册页和整个互联网; 但是我觉得这一切都解决了,这看起来很混乱!

python testing packages nose

5
推荐指数
1
解决办法
1430
查看次数

存储解构图以供以后使用

我一直试图让它与引用,引用拼接,评估以及我能想到的其他任何东西一起工作,但到目前为止还没有运气.我明白为什么它不工作-它被看作是一张地图,它试图EVAL a,bc-只是没有怎么去解决它.

(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)

我有一个相当复杂的解构图,我正在考虑使用几次,所以把它藏在某个地方似乎是个好主意.也许还有更好的方法可以解决这个问题?

clojure map destructuring

5
推荐指数
1
解决办法
137
查看次数

有没有办法知道参数的值是否是默认值与用户指定的值?

我正在寻找像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个调用返回的结果完全相同.

python arguments

4
推荐指数
2
解决办法
207
查看次数

Python - 在派生类定义中附加到类级别列表

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)

python class-variables

2
推荐指数
1
解决办法
497
查看次数

可切换的点访问Python dicts?

我还没有看过字典点访问的可切换版本.

我在这里的首次尝试不起作用:

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)

python dictionary setattr getattr

2
推荐指数
1
解决办法
1685
查看次数

如何转义与python关键字匹配的bash关键字?

示例 - 任何bash关键字(例如elsein)也会导致:

$ 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)

双引号无法修复它.

python bash command-line escaping keyword

1
推荐指数
1
解决办法
308
查看次数

在一行中分配多个变量

我正在尝试制作斐波那契数列,但我不明白为什么会这样:

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)

返回斐波那契数列。

python

1
推荐指数
1
解决办法
624
查看次数

Python - 执行一个实例?

是否可以执行类的实例?我不是指实例化一个类,或者执行一个方法.我的意思是__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)

python class function

0
推荐指数
1
解决办法
90
查看次数