2017-01-27 3 views
0

У меня есть сценарий, который отправляет мне ссылки на меня.Функция лямбда не печатает значения вместо печати значения объекта

Проблема заключается в том, что ссылки не быть включены, вместо этого я получаю:

<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 = '[email protected]' 

    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.

Таким образом, что я, возможно, делаю неправильно здесь?

+1

Прежде всего, значение 'None' так как вы" return "утверждение' print', а во-вторых, почему вы используете лямбда? –

+0

Функция 'lambda' ничего не делает, потому что она никогда не вызывается. –

ответ

4

Я не знаю, почему вы используете print или lambda в любом случае. Если вы просто написали:

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()

Я думаю, однако, что вы на самом деле не понимают, что lambda и print должны делать. print используется для записи данных на стандартный выходной канал, но вы хотите записать его в электронное письмо, поэтому вам не нужно его печатать локально, вам нужно как-то сохранить ваше сообщение в памяти.

Наконец lambda:... используется для создания анонимной функции, если вы не кормите его аргументами, его использование, как правило, отложить исполнение (например, для достижения леней). Но вот вам на самом деле нужно сообщение, так что снова не нужно использовать эту конструкцию.

+0

Я думаю, вы хотите прокомментировать 'msg = str (TEXT)'? – Jshee

+0

@ Jshee: комментарий или удаление. Действительно, мой плохой ...Сожалею. –

+0

Это действительно полезно. Таким образом, для использования 'format()' i не нужно вызывать функцию типа 'print()' раньше? – Jshee

1

Когда вы говорите

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

Yo просто создаем функцию лямбда, она еще не выполнена. Для того, чтобы выполнить вам нужно специально вызвать его по телефону TEXT()

Для того, чтобы исправить изменение проблемы в

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

И msg = str(TEXT())

+0

Я не думаю, что вам нужна лямбда, это приведет только к накладным расходам ... –

+0

Вы не используете 'return' в' lambda' -функциях; результат выражения возвращается неявно. И да, в любом случае, «лямбда» вообще не требуется. – ShadowRanger

+0

@ShadowRanger. Правда. Ответ обновлен. – gipsy