Архив автора: admin

7.3.5. namedtuple() — фабричная функция для кортежей с именованными полями

Именованные кортежи определяют имена для каждой позиции в кортеже  и позволяют создавать более читаемый и понятный код. Они могут быть использованы в тех же случаях, что и обычные кортежи, а обращаться к полям можно не только по индексу, но и по имени.

collections.namedtuple(typenamefield_namesverbose=Falserename=False)
Возвращает новый подкласс кортежа с именем typename. Новый подкласс используется для создания кортежеподобных объектов, поля которых доступны как для просмотра через атрибуты, так и для индексации и итерации. Экземпляры этого подкласса так же содержат строку документации (с именем типа и именами полей)  и полезный метод __repr__(),который отображает содержимое кортежа в форме name=value.

field_names — одна строка, где каждое имя поля отделено от другого пробелами и/или запятыми, например 'x y' or 'x, y'. Кроме того, в этом параметре можно передать последовательность строк ['x', 'y'].
Любые корректные идентификаторы Python могут использоваться в качестве имён полей, за исключением имён, начинающихся с нижнего подчёркивания. Корректные идентификаторы состоят из букв, цифр и нижних подчёркиваний, но не начинается с цифры или нижнего подчёркивания, а так же не может совпадать с одним из keyword например classforreturnglobalpass, или raise.
Если rename=true, некорректные имена полей автоматически заменяются позиционными именами, например ['abc', 'def', 'ghi', 'abc'] будет преобразовано в ['abc', '_1', 'ghi', '_3'], заменив ключевое слово def и повторяющееся имя поля abc.
Если verbose = true, определение класса будет напечатано после того, как класс будет создан. Эта опция устаревшая, вместо неё проще распечатать атрибут _source.
Экземпляры именованного кортежа не имеют своего личного словаря, так что они занимают не больше места, чем обычные кортежи..
Изменения в версии 3.1: Добавлена поддержка метода rename.
>>>

>>> # простой пример
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22) # создаём экземпляр с позиционными или именованными аргументами
>>> p[0] + p[1] # можно получать значения по индексу, как в обычном кортеже (11, 22)
33
>>> x, y = p # распаковывается как обычный кортеж
>>> x, y
(11, 22)
>>> p.x + p.y # поля доступны и по именам
33
>>> p # метод __repr__ с форматом name=value
Point(x=11, y=22)
Именованные кортежи особенно полезны для задания имён полей кортежей, возвращаемых модулями csv или sqlite3:
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
print(emp.name, emp.title)

import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
print(emp.name, emp.title)
В дополнение к методам, унаследованным от кортежей, именованные кортежи поддерживают три дополнительных метода и два атрибута. Для того, чтобы предотвратить конфликты с именами полей, эти методы и атрибуты начинаются с нижних подчёркиваний.
classmethod somenamedtuple._make(iterable)
Метод класса, который создаёт новый экземпляр из существующей последовательности или итератора.
>>>

>>> t = [11, 22]
>>> Point._make(t)
Point(x=11, y=22)
somenamedtuple._asdict()
Возвращает новый OrderedDict который отображает имена полей на соответствующие значения. Обратите внимание, что этот метод уже не требуется, так как тот же самый эффект может быть достигнут при помощи встроенной функции vars():
>>>

>>> vars(p)
OrderedDict([('x', 11), ('y', 22)])
Изменения в версии 3.1: Возвращает OrderedDict вместо обычного dict.
somenamedtuple._replace(kwargs)
Возвращает новый экземпляр именованного кортежа, заменяя определённые пля новыми значениями:
>>>

>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22)

>>> for partnum, record in inventory.items():
... inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
somenamedtuple._source
Строка с исходным кодом Python, используемым для создания класса именованного кортежа. Этот код позволяет легко получить документацию для именованного кортежа. Его можно вывести на экран, выполнить при помощи exec(), или сохранить в файл и импортировать.
Добавлено в версии 3.3.
somenamedtuple._fields
Кортеж строк с именами полей. Полезен для интроспекции и для создания новых типов именованных кортежей из уже существующих.
>>>

>>> p._fields            # просмотреть имена полей
('x', 'y')

>>> Color = namedtuple('Color', 'red green blue')
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22, red=128, green=255, blue=0)
Чтобы получить значения полей, чьи имена сохранены как строки, используйте функцию getattr():
>>>

>>> getattr(p, 'x')
11
Что преобразовать словарь в именованный кортеж используйте операцию распаковывания словаря (как описано в Unpacking Argument Lists):
>>>

>>> d = {'x': 11, 'y': 22}
>>> Point(**d)
Point(x=11, y=22)
Так как именованный кортеж — это обычный класс Python, к нему легко добавлять новую функциональность или изменить уже существующую, просто создавая его подклассы. Тут показано как добавить подсчитываемое поле и изменить формат отображения класса:
>>>

>>> class Point(namedtuple('Point', 'x y')):
__slots__ = ()
@property
def hypot(self):
return (self.x ** 2 + self.y ** 2) ** 0.5
def __str__(self):
return 'Point: x=%6.3f y=%6.3f hypot=%6.3f' % (self.x, self.y, self.hypot)
>>>

>>> for p in Point(3, 4), Point(14, 5/7):
print(p)
Point: x= 3.000 y= 4.000 hypot= 5.000
Point: x=14.000 y= 0.714 hypot=14.018
Подкласс, показанный выше, устанавливает атрибут __slots__ в пустой кортеж. Это помогает сократить использование памяти, не допуская создавать словари для экземпляров.
Подклассы не очень полезны для добавления новых полей. Вместо этого, лучше создать новый тип именованного кортежа, используя атрибут _fields имеющегося:
>>>

>>> Point3D = namedtuple('Point3D', Point._fields + ('z',))
Значения по умолчанию можно реализовать используя метод _replace() для настройки экземпляра прототипа
>>>

>>> Account = namedtuple('Account', 'owner balance transaction_count')
>>> default_account = Account('', 0.0, 0)
>>> johns_account = default_account._replace(owner='John')
>>> janes_account = default_account._replace(owner='Jane')
Перечисляемые константы можно задать при помощи именованного кортежа, но  проще сделать это используя  простой класс:
>>>

>>> Status = namedtuple('Status', 'open pending closed&#
39;)._make(range(3))
>>> Status.open, Status.pending, Status.closed
(0, 1, 2)
>>> class Status:
open, pending, closed = range(3)
См также

Автор: Ishayahu Lastov

Системы активной рекламы (САР)

4 года назад, в июне 2008-го, мы уже обращались к теме САР. Пользоваться ими или нет для раскрутки своего сайта или блога — дело индивидуальное. Я считаю, что на первых порах молодому ресурсу эти сервисы вполне могут помочь набрать первых лояльных читателей. При условии, что молодой ресурс действительно того стоит.

У тех, кому не нужно раскручивать свой сайт, системы активной рекламы выкупают накопленные кредиты и переводят их на кошелек платежных систем. Это, кстати, намного выгоднее заработка на «почтовиках».

системы активной рекламы Читать

Сумка с листочками

Сумка с листочками

Сегодня нам с вами предстоит очень интересная и оригинальная работа: мы будем делать узоры на ткани своими руками, но не специальными красками, и не при помощи иголки и ниток, даже не бисером, а нашими помощниками будут настоящие листья деревьев, цветов, кустарников.

узоры на ткани своими руками

Читать

Canoniсal анонсировала Ubuntu WebApps

Марк Шаттлворт объявил о том, что октябрьский релиз Ubuntu 12.10 Quantal Queztal будет включать в себя технологию работы с web-приложениями без явной работы пользователя с браузером — Ubuntu WebApps. Читать

Как составить правильный robots.txt для блога на WordPress

Здравствуйте, уважаемые посетители блога! В этой статье я расскажу о том, как создать правильный robots.txt для WordPress. Но сначала давайте разберемся зачем нужно создавать файл robots.txt, и можно ли обойтись без него?

Зачем нужен файл Роботс?

Если Вы уже создали блог на WordPress или только занимаетесь его разработкой, то заметили, что статьи полностью или анонсами показываются на страницах категорий,  архивов, меток, результатов поиска, а на некоторых блогах и на главной странице. То это приводит к появлению дублированного контента. Т.е. поисковый робот, просматривая сайт, находит один и тот же текст, но по разным адресам. Такой контент он может посчитать не уникальным и приравнять его к ворованному контенту. А это грозит санкциями и фильтром от поисковых систем.

В файле robots.txt как раз и указывается какие разделы блога поисковому роботу нужно индексировать, а какие нет. Также, можно запретить индексацию определенных служебных каталогов.

Как показала практика, за два года многое поменялось. Эта статья была написала в июле 2012 года, а то текст, который Вы читаете сейчас и его продолжение ниже, я написала в июле 2014 года. Собственно, а что поменялось?

Как было раньше. Через файл роботс мы давали указание поисковым роботам не забирать в свою базу определенные страницы сайта. Но теперь, в частности Google, не обращает внимания на указания (директивы) в robots.txt. Не смотря на то, что в robots txt стоит запрет индексации категорий, архивов, древовидных комментариев, а робот все равно их заносит в свою базу.

К счастью, Яндекс, в отличии от Google, не наказывает за дублированные страницы с повторяющимся контетом. Пока не наказывает. Скорее всего придет время, когда технологии Яндекса догонят Google, и тогда реакция Яндекса на дубли будет иной.

Для wordpress robots.txt не такой, как для других движков. И в первую очередь это связано с особенностями самого движка WordPress. В WordPress есть проблема с дублями, которые создают древовидные комментарии. Решение этой проблемы я описывала в статье https://inetsovety.ru/kak-ubrat-dubli-stranits-replytocom/

Как создать правильный robots.txt для блога на WordPress

В файле роботс мы разрешаем роботу заходить на страницы с дублями, но запрещаем с помощью мета тега:

<meta name='robots' content='noindex,follow' />

Для абсолютно всех страниц сайта мы не можем добавить этот тег, только для страниц пагинации (постраничной навигации). Остальные дубли мы исключаем с помощью редиректа. Внимательно изучите статью о дублях древовидных комментариев и примените ее, прежде чем ставить себе тот роботс, который я дам ниже. Если Вы поставите на свой блог этот роботс, но не настроите редиректы и мета теги, то рискуете получить  фильтры в поисковиках. Поэтому выполняйте все рекомендации по пунктам. Не поленитесь создать резервные копии файлов темы, файлов .htaccess и robots.txt.

  1.  Вносим правки в файл .htaccess, настраивая редиректы. Можете, либо скопировать и вставить этот код, либо взять готовый файл из предыдущей статьи.
    # BEGIN WordPress

    <IfModule mod_rewrite.c>

    RewriteEngine On

    RewriteBase /

    RewriteCond %{QUERY_STRING} ^replytocom= [NC]

    RewriteRule (.*) $1? [R=301,L]

    RewriteRule (.+)/feed /$1 [R=301,L]

    RewriteRule (.+)/comments /$1 [R=301,L]

    RewriteRule (.+)/comment-page /$1 [R=301,L]

    RewriteRule (.+)/trackback /$1 [R=301,L]

    RewriteRule (.+)/attachment /$1 [R=301,L]

    RewriteCond %{QUERY_STRING} ^attachment_id= [NC]

    RewriteRule (.*) $1? [R=301,L]

    RewriteRule ^index.php$ - [L]

    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule . /index.php [L]

    </IfModule>

     

    # END WordPress

  2. Добавляем мета тег для постраничной навигации в файл function.php. Код добавляем сразу после строчки <?php:
    	function my_meta_noindex () {

    		if (

    			is_paged() 

    		) {echo "".'<meta name="robots" content="noindex,nofollow" />'."n";}

    	}

     

    add_action('wp_head', 'my_meta_noindex', 3);

  3. Проверьте, что на страницах постраничной навигации, в рубриках в исходном коде страницы присутствует код
    <meta name='robots' content='noindex,follow' />

    Для этого нажмите CTRL+U (одновременно нажмите на две кнопки на клавиатуре CTRL и U). Чтобы не просматривать сотни строчек кода, снова одновременно нажимаете CTRL и F, на странице с кодом. Внизу слева появится форма поиска по странице. В нее вставляйте meta name и жмите поиск.

  4. Ставим запрет на индексацию нежелательных страниц в плагине All in One Seo Pack:правильный robots.txt и настройки индексации в сео плагине All in One Seo Pack
  5. А вот теперь, когда предыдущие 4 пункта выполнены, ставьте robots.txt, который не запрещает роботам ходит по дублированным страницам. По этой ссылке Вы можете скачать готовый правильный robots.txt для WordPress, который использую я и много других людей — ссылка на скачивание.

После того, как Вы скачали архив с файлом. Вам нужно в самом конце файла поменять сайт.ru на адрес своего сайта. Сделать это нужно в этих строках:

Host: сайт.ru

Sitemap: http://сайт.ru/sitemap.xml.gz

Sitemap: http://сайт.ru/sitemap.xml

Две последние строки указываю поисковому роботу адрес карты сайта.

После того, как Вы изменили в файле robots.txt установили адрес своего сайта, загрузите его на хостинг через ftp клиент FileZilla. Если у Вас возник вопрос, а куда его загружать? Файл robots txt должен находится в основной папке, рядом в папками wp-content, wp-includes.

А в данном видео, Вы более детально сможете узнать о директивах, которые прописываются в robots.txt: