Python如何使用池映射传递多个参数

2024-06-16 10:56:47 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的代码片段:

data = [currentAccount.login,currentAccount.password,campaign.titlesFile,campaign.licLocFile,campaign.subCity,campaign.bodiesMainFile,campaign.bodiesKeywordsFile,campaign.bodiesIntroFile]
results = multiprocessing.Pool(5).map(partial(self.postAd,data),range(3))
...
def postAd (self,login,password,titlesFile,licLocFile,subCity,bodiesMainFile,bodiesKeywordsFile,bodiesIntroFile):
...

(只是为了让你知道发生了什么:currentAccount和campaign是类,它们是这些类中的变量。使用self b/c这一切都是在一个类中运行的。我想逃跑自我邮递3x传递数据中的所有变量)

当我运行时,它显示“postAd()缺少6个必需的位置参数:”“titlesFile”“、”“licLocFile”“、”“subCity”“、”“bodiesMainFile”“、”“bodiesKeywordsFile”“和”“bodiesIntroFile'”

我做错什么了?为什么它只接受2个变量?在

如果我不能使用游泳池地图,我应该怎么做?在

我也尝试过,但没有成功:

^{pr2}$

Tags: 代码selfdataloginpasswordresultscampaigntitlesfile
1条回答
网友
1楼 · 发布于 2024-06-16 10:56:47

您的第一次尝试是滥用partialdata是一个单参数:作为一个列表,它不会自动解包其内容。partial只接受变量参数,因此您应该“正常”传递这些参数

partial(self.postAd, currentAccount.login,currentAccount.password, ...

或者

^{pr2}$

它说postAd接收了两个参数而不是一个(data)的原因是它还隐式地接收了self参数。在

您的第二次尝试是正确的,而且非常接近,但是碰巧in older versions of python pickle (which is essential for multiprocessing) can't handle lambdas。将lambda替换为使用def定义的命名函数:

def postNow(arg):  # Accepts an argument from map which it ignores
    self.postAd(currentAccount.login, ..., campaign.bodiesIntroFile)

旁注:

当lambda只有一个参数时,它被称为args,这有点奇怪。如果您的目的是使其灵活并接受变量参数,请使用lambda *args: ...或甚至lambda *args, **kwargs: ...来接受关键字参数。名字不重要,只是惯例而已。重要的部分是*和{}。请注意,partial有这样一个签名,例如。在

我从来没有在第二次尝试中看到过这个问题。我是通过谷歌搜索错误信息才学会的。总是用谷歌搜索。在

相关问题 更多 >