标签: argument-unpacking

将解压缩参数传递给Python时打印时出现语法错误

而不是像这样简单的调试/日志打印:

print "error ", error_number
Run Code Online (Sandbox Code Playgroud)

我想使用一个日志功能,我可以在需要时展开这样的东西:

def log(condition, *message):
    if(<do something here...>):
        print(*message)
        <perhaps do something more...>
Run Code Online (Sandbox Code Playgroud)

并称之为:

log(condition, "error ", error_number)
Run Code Online (Sandbox Code Playgroud)

但是我得到以下语法错误:

print *message
      ^ SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

它是打印功能的限制还是有某种方法使它工作?如果没有,是否有相当于我可以使用的印刷品?

我顺便使用Python 2.7 ...

python argument-unpacking python-2.7

5
推荐指数
2
解决办法
3055
查看次数

用C++解压缩参数包

我有两个函数fg.f异步计算它的返回值并返回一个未来.现在,基于几个返回值f,我想调用g,但我想确保值的计算f并行发生.

请考虑以下代码:

template <typename T>
std::future<T> f(T& t);

template <typename... T>
void g(T&&... t)

template <typename... T>
void call_wrapper(T&&... t) {
  auto f1 = f(t1); // How do I set the values of f1... fn
  auto f2 = f(t2);
  ...
  g(f1.get(), f2.get()....); // How do I call g
}
Run Code Online (Sandbox Code Playgroud)

如何从函数的可变参数模板T中解压缩类型call_wrapper

c++ future argument-unpacking variadic-templates c++11

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

解包嵌套列表以获取map()的参数

我确信有办法做到这一点,但我找不到它.说我有:

foo = [
    [1, 2],
    [3, 4],
    [5, 6]
]

def add(num1, num2):
    return num1 + num2
Run Code Online (Sandbox Code Playgroud)

然后,我如何使用map(add, foo)它传递num1=1,num2=2第一次迭代,即它add(1, 2),然后add(3, 4)第二次,等等?

  • map(add, foo)显然尝试add([1, 2], #nothing)第一次迭代
  • 尝试map(add, *foo)add(1, 3, 5)了第一次迭代

我希望在第一次迭代时map(add, foo)做类似的事情add(1, 2).

预期产量: [3, 7, 11]

python arguments list argument-unpacking map-function

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

解压字典并作为关键字参数传递给函数

我正在尝试在 python 中将一些 dict 解压缩到一些函数中:

我有一个packet作为参数的函数(应该是dict)

def queue(self, packet):
    self.topic.publish(self.message, self.client, **packet)
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

queue({
        'an_item': 1,
        'a_key': 'value'
    })
Run Code Online (Sandbox Code Playgroud)

发布功能位于第 3 方 api(Google Pub/Sub API)中,并且来自我查看的源代码:

def publish(self, message, client=None, **attrs):
    ...
    message_data = {'data': message, 'attributes': attrs}
    message_ids = api.topic_publish(self.full_name, [message_data])
Run Code Online (Sandbox Code Playgroud)

它接受 **attrs 以便将所有关键字参数传递给另一个函数。

目前..我的 queue() 函数不起作用。

如果可能,我如何修复我的queue()函数以将packetdict 参数解压缩为publish()可接受的内容?

谢谢!


编辑:

我收到了一些错误消息。

为了:

def queue(self, packet):
    self.topic.publish(self.message, self.client, **packet)
Run Code Online (Sandbox Code Playgroud)

我得到: TypeError: 1 has type <class 'int'>, but expected one of: …

python dictionary argument-unpacking python-3.x google-cloud-pubsub

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

将可变参数模板解压到initializer_list并同时调用两个函数

我有两个向量:

std::vector<int> v1{ 1, 2, 3 };
std::vector<int> v2{ 4, 5, 6 };
Run Code Online (Sandbox Code Playgroud)

我想创建一个对象,其中std::initializer_list包含指向上述向量的第一个和最后一个元素的迭代器。

我想要一个带有可变参数模板的函数:

template<class... Ts>
void foo(Ts... args)
Run Code Online (Sandbox Code Playgroud)

在上面的函数中我想解压所有参数。到目前为止我实现了:

template<class... Ts>
void foo(Ts... args)
{
  std::initializer_list<std::vector<int>::iterator> il{
    (std::begin(args), std::end(args))...
  };
}

int main()
{
  std::vector<int> v1{ 1, 2, 3 };
  std::vector<int> v2{ 4, 5, 6 };

  foo(v1, v2);
}
Run Code Online (Sandbox Code Playgroud)

但它没有按预期工作,因为operator,. initializer_list当前的实现使用两个迭代器创建。在这种情况下我想要的是有一个initializer_list4 个迭代器指向这两个向量的第一个和最后一个元素。我想要的是begin,,,。endbeginend

c++ initializer-list argument-unpacking variadic-templates c++17

5
推荐指数
2
解决办法
92
查看次数

python:从字典中调用构造函数?

我不太清楚这里的术语所以请耐心等待....

假设我有一个这样的构造函数调用:

machineSpecificEnvironment = Environment(
   TI_C28_ROOT = 'C:/appl/ti/ccs/4.1.1/ccsv4/tools/compiler/c2000',
   JSDB = 'c:/bin/jsdb/jsdb.exe',
   PYTHON_PATH = 'c:/appl/python/2.6.4',
)
Run Code Online (Sandbox Code Playgroud)

除了我想通过提供给我的字典上的操作来替换它:

keys = {'TI_C28_ROOT': 'C:/appl/ti/ccs/4.1.1/ccsv4/tools/compiler/c2000',
        'JSDB': 'c:/bin/jsdb/jsdb.exe',
        'PYTHON_PATH': 'c:/appl/python/2.6.4'}
machineSpecificEnvironment = Environment(
     ... what do I put here? it needs to be a function of "keys" ...
)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

python dictionary argument-unpacking

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

解包许多返回值时行长度和格式的 Python 样式

假设该函数some_descriptively_named_function返回 4- tupleof 4 个返回参数。我想调用some_descriptively_named_function,遵守 80 个字符的行长度限制,并将所有 4 个输出解压缩到一个描述性命名的变量中:

some_desc_name1, some_desc_name2, some_desc_name3, some_desc_name4 = some_descriptively_named_function() 
Run Code Online (Sandbox Code Playgroud)

一种选择是:

some_desc_name1, some_desc_name2, some_desc_name3, some_desc_name4 = (
    some_descriptively_named_function()
)
Run Code Online (Sandbox Code Playgroud)

但是,对于四个未打包的值,即使这样也可以推动它的行长。如果我想对每个论点做一个简短的评论,要很好地阐述它并不容易。

以下工作,但不清楚这是否被认为是好的或非常糟糕。

(some_desc_name1, # Comment 1
 some_desc_name2, # Comment 3
 some_desc_name3, # Comment 3
 some_desc_name4  # Comment 4
) = some_descriptively_named_function()
Run Code Online (Sandbox Code Playgroud)

这对于行长当然很好,但是尝试考虑 PEP8 如何适用于发生在行首的括号是很奇怪的。

是否有一个既定的(希望与 PEP8 相关的)Python 风格指南?

python pep8 argument-unpacking iterable-unpacking

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

通过名称动态传递参数

是否可以动态设置传递给函数的参数的名称?

像这样:

def func(one=None, two=None, three=None, four=None):
    ...

params = ("one","two","three","four",)
for var in params:
    tmp = func(var=value)
Run Code Online (Sandbox Code Playgroud)

python dynamic parameter-passing argument-unpacking python-3.x

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

为什么max(*list)和max(list)在python中做同样的事情?

见下面的例子:

>>>f = [[1],[2],[3]]
>>>max(f)
Out[21]: [3]
>>>max(*f)
Out[22]: [3]
Run Code Online (Sandbox Code Playgroud)

unpack运算符在这里没有效果,我试图解压缩列表并获得矩阵的最大值(两个暗淡列表).

python argument-unpacking

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

理解Python中的星号运算符位于括号中的函数之前

我知道星号用于解包系统参数等值或将列表解包到变量中。

但我之前在这个 asyncio 示例中没有见过这种语法。

我在这里阅读这篇文章,https://realpython.com/async-io-python/#the-10000-foot-view-of-async-io,但我不明白星号运算符在这做什么语境。

#!/usr/bin/env python3
# rand.py

import asyncio
import random

# ANSI colors
c = (
    "\033[0m",   # End of color
    "\033[36m",  # Cyan
    "\033[91m",  # Red
    "\033[35m",  # Magenta
)

async def makerandom(idx: int, threshold: int = 6) -> int:
    print(c[idx + 1] + f"Initiated makerandom({idx}).")
    i = random.randint(0, 10)
    while i <= threshold:
        print(c[idx + 1] + f"makerandom({idx}) == {i} too low; retrying.")
        await asyncio.sleep(idx + 1)
        i = random.randint(0, 10)
    print(c[idx + …
Run Code Online (Sandbox Code Playgroud)

python syntax asynchronous argument-unpacking python-asyncio

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