而不是像这样简单的调试/日志打印:
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 ...
我有两个函数f
和g
.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
?
我确信有办法做到这一点,但我找不到它.说我有:
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 中将一些 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()
函数以将packet
dict 参数解压缩为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
我有两个向量:
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_list
4 个迭代器指向这两个向量的第一个和最后一个元素。我想要的是begin
,,,。end
begin
end
c++ initializer-list argument-unpacking variadic-templates c++17
我不太清楚这里的术语所以请耐心等待....
假设我有一个这样的构造函数调用:
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)
我怎样才能做到这一点?
假设该函数some_descriptively_named_function
返回 4- tuple
of 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 风格指南?
是否可以动态设置传递给函数的参数的名称?
像这样:
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
见下面的例子:
>>>f = [[1],[2],[3]]
>>>max(f)
Out[21]: [3]
>>>max(*f)
Out[22]: [3]
Run Code Online (Sandbox Code Playgroud)
unpack运算符在这里没有效果,我试图解压缩列表并获得矩阵的最大值(两个暗淡列表).
我知道星号用于解包系统参数等值或将列表解包到变量中。
但我之前在这个 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
python ×8
c++ ×2
dictionary ×2
python-3.x ×2
arguments ×1
asynchronous ×1
c++11 ×1
c++17 ×1
dynamic ×1
future ×1
list ×1
map-function ×1
pep8 ×1
python-2.7 ×1
syntax ×1