小编Ant*_*lix的帖子

解压缩多个列表作为函数的参数

如果我有这样的功能:

def f(a,b,c,d):
    print a,b,c,d
Run Code Online (Sandbox Code Playgroud)

那么为什么会这样:

f(1,2,3,4)
f(*[1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

但不是这个:

f(*[1,2] , *[3,4])
    f(*[1,2] , *[3,4])
               ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

编辑:有关信息,最初的问题是替换函数包装器中的一个参数.我想替换输入的*args的给定成员并尝试类似于:

def vectorize_pos(f,n=0):
    '''
    Decorator, vectorize the processing of the nth argument
    :param f: function that dont accept a list as nth argument
    '''
    def vectorizedFunction(*args,**kwargs):
        if isinstance(args[n],list):
            return map(lambda x : f( *(args[:n]) , x , *(args[n+1,:]), **kwargs),args[n])
        else:
            return f(*args,**kwargs)
    return vectorizedFunction
Run Code Online (Sandbox Code Playgroud)

这就是问题产生的地方.而且我知道还有其他方法可以做同样的事情,但只想了解为什么解压缩一个序列工作但不是更多.

python

20
推荐指数
4
解决办法
8482
查看次数

为 Enum 的子类重载 __init__()

我正在尝试重载__init__()枚举子类的方法。奇怪的是,适用于普通类的模式不再适用于 Enum。

下面显示了使用普通类的所需模式:

class Integer:
    def __init__(self, a):
        """Accepts only int"""
        assert isinstance(a, int)
        self.a = a

    def __repr__(self):
        return str(self.a)


class RobustInteger(Integer):
    def __init__(self, a):
        """Accepts int or str"""
        if isinstance(a, str):
            super().__init__(int(a))
        else:
            super().__init__(a)


print(Integer(1))
# 1
print(RobustInteger(1))
# 1
print(RobustInteger('1'))
# 1

Run Code Online (Sandbox Code Playgroud)

如果与 Enum 一起使用,则相同的模式会中断:

from enum import Enum
from datetime import date


class WeekDay(Enum):
    MONDAY = 0
    TUESDAY = 1
    WEDNESDAY = 2
    THURSDAY = 3
    FRIDAY = 4
    SATURDAY = 5
    SUNDAY = …
Run Code Online (Sandbox Code Playgroud)

python inheritance enums python-3.x python-3.6

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

"列表理解" - 样式语法外部列表?

我发现列表理解语法非常有用且紧凑.一直使用它后,它让我想在列表外使用它,例如我想改变:

s="sausages hamsters"
intermediate=" and "
word1,word2=s.split()
s2=word1+intermediate+word2
Run Code Online (Sandbox Code Playgroud)

word1,word2=s.split()
s2=word1+intermediate+word2 for word1,word2 in s.split
Run Code Online (Sandbox Code Playgroud)

显然它不起作用.我在这里遗漏了什么,或者这根本不可能在一行中完成?

编辑:当然这个例子很愚蠢但在某些情况下我可以看到这个节省多行

编辑:我刚刚编写了示例,以使其阅读更加愉快,但我的问题的更多文字版本将是:

"在一个声明中,有没有办法以这种方式创建变量:

newVar= <expression using still undefined variables> \  
        <some keyword or symbols> \  
         <declaration of pre-cited undefined variables>
Run Code Online (Sandbox Code Playgroud)

就像列表理解允许这样做:

newList=[<expression using still undefined variables>  
    for <declaration of pre-cited undefined variables, as result of an iterator>]
Run Code Online (Sandbox Code Playgroud)

如果我们可以建立列表,是否也可以用于简单的单个对象?"

python list-comprehension

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