【问题标题】:lambda function not printing values instead printing object valuelambda函数不打印值而是打印对象值
【发布时间】:2017-01-27 20:51:30
【问题描述】:

我有一个脚本可以通过电子邮件向我发送指向我的链接。

问题是链接不包括在内,而是我得到:

<function <lambda> at 0x7f75b5fb4a60>

我的脚本如下所示:

from bs4 import BeautifulSoup
import re
import requests

ex_webdev_js_by_city = [
'http://boston.website.org/search/web',
]

ex_web_j_keywords = [['one'],['coool', 'person']]
ex_web_j_keywords = sum(ex_web_j_keywords, [])

ex_js = []

for webdev_j_for_a_city in ex_webdev_js_by_city:
    webdev_j = requests.get(webdev_j_for_a_city)
    soup = BeautifulSoup(webdev_j.text, "lxml")
    for j_keyword in ex_web_j_keywords:
        for a in soup.find_all('a', class_="result-title hdrlnk", text=re.compile(j_keyword,re.IGNORECASE)):
            #print(a.get('href'))
            ex_js.append(a.get('href'))

if ex_js:
   #email them to myself!
   import smtplib, socket
   TO = 'myemail@gmail.com'

   try:
       server = smtplib.SMTP('smtp.gmail.com', 587)
       server.starttls()
       TEXT = lambda: print(('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js))
       #Gmail Sign In
       gmail_sender = 'myemail'
       gmail_passwd = 'mypass'
       server.login(gmail_sender, gmail_passwd)
       msg = str(TEXT)
       server.sendmail(gmail_sender, gmail_sender, msg)
       print('Sent you some links!')
       server.quit()
   except socket.error as e:
       print ('error sending mail, error was {}'.format(e))

此行发生错误(我相信):

lambda: print(('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js))

它似乎在给我的电子邮件中打印出object details,而不是value

那么,我在这里可能做错了什么?

【问题讨论】:

  • 首先,值是None,因为您“返回”了print 语句,其次,您为什么使用lambda?
  • lambda 函数没有做任何事情,因为它从未被调用过。

标签: python python-3.x lambda output


【解决方案1】:

我不知道你为什么要使用printlambda。如果你只是写:

msg = ('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js)

并删除:

msg = str(TEXT)

它应该可以工作。

所以try 块应该是:

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
msg = ('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js)
#Gmail Sign In
gmail_sender = 'myemail'
gmail_passwd = 'mypass'
server.login(gmail_sender, gmail_passwd)
# msg = str(TEXT) !!commented out!! (only to make it explicit)
server.sendmail(gmail_sender, gmail_sender, msg)
print('Sent you some links!')
server.quit()

但是我认为您并不真正了解 lambdaprint 应该做什么。 print 用于将数据写入标准输出通道,但您想将其写入电子邮件,因此您不需要在本地打印它,您需要以某种方式存储您的消息在记忆中

最后lambda:... 用于创建一个匿名函数,如果你不给它任何参数,它的用途通常是推迟执行(例如实现惰性)。但是这里你实际上需要消息,所以再次不需要使用这个构造。

【讨论】:

  • 我想你的意思是把msg=str(TEXT)注释掉?
  • @Jshee:注释掉或删除。确实,我的错……对不起。
  • 这真的很有帮助。那么,要使用format(),我之前不需要调用像print() 这样的函数吗?
  • @Jshee:没有格式是在字符串上定义的函数(如您所见here),print 与此无关。使用它时,您只需.format 的输出提供给print
【解决方案2】:

当你说

TEXT = lambda: print(('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js))

你只是在创建 lambda 函数,它还没有执行。为了执行你需要通过调用TEXT()来专门调用它

为了解决您的问题更改为

TEXT = lambda: ('Latest js from site:\n\n{}'*len(ex_js)).format(*ex_js)

还有msg = str(TEXT())

【讨论】:

  • 你不要在lambda函数中使用return;隐式返回表达式的结果。是的,无论如何,在这种情况下根本不需要lambda
  • @WillemVanOnsem 我试图回答最初的问题。没有试图质疑他的代码。你是绝对正确的,这种情况我们不需要 lambda
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多