Вопрос по python – Скрытые возможности Python [закрыто]

1420

Каковы менее известные, но полезные функции языка программирования Python?

Try to limit answers to Python core. One feature per answer. Give an example and short description of the feature, not just a link to documentation. Label the feature using a title as the first line. Quick links to answers: Argument Unpacking Braces Chaining Comparison Operators Decorators Default Argument Gotchas / Dangers of Mutable Default arguments Descriptors Dictionary default .get value Docstring Tests Ellipsis Slicing Syntax Enumeration For/else Function as iter() argument Generator expressions import this In Place Value Swapping List stepping __missing__ items Multi-line Regex Named string formatting Nested list/generator comprehensions New types at runtime .pth files ROT13 Encoding Regex Debugging Sending to Generators Tab Completion in Interactive Interpreter Ternary Expression try/except/else Unpacking+print() function with statement

Ваш Ответ

29   ответов
106

Main messages :)

import this
# btw look at this module's source :)

Де-cyphered:

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Error: User Rate Limit Exceededwefearchange.org/2010/06/import-this-and-zen-of-python.html
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededprint s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))Error: User Rate Limit Exceeded
91

Вложенные списки и выражения генератора:

[(i,j) for i in range(3) for j in range(i) ]    
((i,j) for i in range(4) for j in range(i) )

Они могут заменить огромные куски кода с вложенными циклами.

Error: User Rate Limit ExceededforError: User Rate Limit Exceeded
Error: User Rate Limit ExceededforError: User Rate Limit ExceededifError: User Rate Limit Exceededyield xError: User Rate Limit ExceededxError: User Rate Limit ExceededyieldError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
305

Шаг аргумента в операторах среза. Например:

a = [1,2,3,4,5]
>>> a[::2]  # iterate over the whole list in 2-increments
[1,3,5]

Особый случайx[::-1] является полезной идиомой для "x перевернутого".

>>> a[::-1]
[5,4,3,2,1]
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
138

Named formatting

% -форматирование требует словаря (также применяется проверка% i /% s и т. д.).

>>> print "The %(foo)s is %(bar)i." % {'foo': 'answer', 'bar':42}
The answer is 42.

>>> foo, bar = 'question', 123

>>> print "The %(foo)s is %(bar)i." % locals()
The question is 123.

А так как locals () также является словарем, вы можете просто передать его как dict и иметь% -подстановки из ваших локальных переменных. Я думаю, что это осуждается, но упрощает вещи ..

New Style Formatting

>>> print("The {foo} is {bar}".format(foo='answer', bar=42))
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededhashError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
317

Отправка значений в функции генератора, Например, имея эту функцию:

    """Yield 5 until something else is passed back via send()"""
    a = 5
    while True:
        f = (yield a) #yield a and possibly get f in return
        if f is not None: 
            a = f  #store the new value

Вы можете:

>>> g = mygen()
>>> g.next()
5
>>> g.next()
5
>>> g.send(7)  #we send this back to the generator
7
>>> g.next() #now it will yield 7 until we send something else
7
Error: User Rate Limit Exceededdabeaz.com/coroutines
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededcallError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
205

ROT13 является действительной кодировкой для исходного кода, когда вы используете правильное объявление кодировки в верхней части файла кода:

#!/usr/bin/env python
# -*- coding: rot13 -*-

cevag "Uryyb fgnpxbiresybj!".rapbqr("rot13")
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededcevag h"Uryyb fgnpxbiresybj!"
Error: User Rate Limit Exceeded
289

Decorators

Декораторы Позволяет обернуть функцию или метод в другую функцию, которая может добавить функциональность, изменить аргументы или результаты и т. д. Декораторы пишутся на одну строку выше определения функции, начиная с символа "at". знак (@).

Пример показываетprint_args декоратор, который печатает аргументы декорированной функции перед вызовом:

>>> def print_args(function):
>>>     def wrapper(*args, **kwargs):
>>>         print 'Arguments:', args, kwargs
>>>         return function(*args, **kwargs)
>>>     return wrapper

>>> @print_args
>>> def write(text):
>>>     print text

>>> write('foo')
Arguments: ('foo',) {}
foo
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededphyast.pitt.edu/~micheles/python/documentation.html
235

Readable regular expressions

В Python вы можете разбить регулярное выражение на несколько строк, назвать свои совпадения и вставить комментарии.

Пример подробного синтаксиса (изПогрузитесь в Python):

>>> pattern = """
... ^                   # beginning of string
... M{0,4}              # thousands - 0 to 4 M's
... (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
...                     #            or 500-800 (D, followed by 0 to 3 C's)
... (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
...                     #        or 50-80 (L, followed by 0 to 3 X's)
... (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
...                     #        or 5-8 (V, followed by 0 to 3 I's)
... $                   # end of string
... """
>>> re.search(pattern, 'M', re.VERBOSE)

Пример именования совпадений (отРегулярное выражение HOWTO)

>>> p = re.compile(r'(?P<word>\b\w+\b)')
>>> m = p.search( '(((( Lots of punctuation )))' )
>>> m.group('word')
'Lots'

Вы также можете подробно написать регулярное выражение, не используяre.VERBOSE благодаря строковому буквальному конкатенации.

>>> pattern = (
...     "^"                 # beginning of string
...     "M{0,4}"            # thousands - 0 to 4 M's
...     "(CM|CD|D?C{0,3})"  # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
...                         #            or 500-800 (D, followed by 0 to 3 C's)
...     "(XC|XL|L?X{0,3})"  # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
...                         #        or 50-80 (L, followed by 0 to 3 X's)
...     "(IX|IV|V?I{0,3})"  # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
...                         #        or 5-8 (V, followed by 0 to 3 I's)
...     "$"                 # end of string
... )
>>> print pattern
"^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$"
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
419

Creating generators objects

Если ты пишешь

x=(n for n in foo if bar(n))

Вы можете достать генератор и назначить его на х. Теперь это означает, что вы можете сделать

for n in x:

Преимущество этого состоит в том, что вам не требуется промежуточное хранилище, которое понадобилось бы, если бы вы это сделали

x = [n for n in foo if bar(n)]

В некоторых случаях это может привести к значительному ускорению.

Вы можете добавить много операторов if в конец генератора, в основном, копируя вложенные циклы:

>>> n = ((a,b) for a in range(0,2) for b in range(4,6))
>>> for i in n:
...   print i 

(0, 4)
(0, 5)
(1, 4)
(1, 5)
Error: User Rate Limit Exceededstackoverflow.com/questions/101268/hidden-features-of-python/…Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
105

Interactive Interpreter Tab Completion

    import readline
except ImportError:
    print "Unable to load readline module."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")


>>> class myclass:
...    def function(self):
...       print "my function"
... 
>>> class_instance = myclass()
>>> class_instance.<TAB>
class_instance.__class__   class_instance.__module__
class_instance.__doc__     class_instance.function
>>> class_instance.f<TAB>unction()

Вам также нужно будет установить переменную окружения PYTHONSTARTUP.

Error: User Rate Limit Exceededpixelbeat.org/scripts/inpy
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededreadline.parse_and_bind ("bind ^I rl_complete")
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededeasy_install ipdbError: User Rate Limit Exceededimport ipdb; ipdb.set_trace()
183

Creating new types in a fully dynamic manner

>>> NewType = type("NewType", (object,), {"x": "hello"})
>>> n = NewType()
>>> n.x
"hello"

что точно так же, как

>>> class NewType(object):
>>>     x = "hello"
>>> n = NewType()
>>> n.x
"hello"

Наверное, не самая полезная вещь, но приятно знать.

Edit: Исправлено имя нового типа, должно бытьNewType быть точно таким же, как сclass заявление.

Edit: Скорректировано название для более точного описания функции.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
353

iter() can take a callable argument

Например:

def seek_next_line(f):
    for c in iter(lambda: f.read(1),'\n'):
        pass

iter(callable, until_value) функция многократно вызываетcallable и дает свой результат доuntil_value возвращается

Error: User Rate Limit ExceededlambdaError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
122

исключениеelse пункт:

try:
  put_4000000000_volts_through_it(parrot)
except Voom:
  print "'E's pining!"
else:
  print "This parrot is no more!"
finally:
  end_sketch()

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

Увидетьhttp://docs.python.org/tut/node10.html

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
258

Начиная с 2.5 года у диктов есть специальный метод__missing__ который вызывается для отсутствующих элементов:

>>> class MyDict(dict):
...  def __missing__(self, key):
...   self[key] = rv = []
...   return rv
... 
>>> m = MyDict()
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}

Существует также подкласс dict вcollections называетсяdefaultdict он делает то же самое, но вызывает функцию без аргументов для несуществующих элементов:

>>> from collections import defaultdict
>>> m = defaultdict(list)
>>> m["foo"].append(1)
>>> m["foo"].append(2)
>>> dict(m)
{'foo': [1, 2]}

Я рекомендую преобразовывать такие диктовки в обычные, прежде чем передавать их функциям, которые не ожидают таких подклассов. Много кода используетd[a_key] и перехватывает KeyErrors, чтобы проверить, существует ли элемент, который добавит новый элемент к dict.

Error: User Rate Limit ExceededunlessError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededm={}; m.setdefault('foo', []).append(1).
defaultdictError: User Rate Limit ExceededsetdefaultError: User Rate Limit Exceededdd = collections.defaultdict(int) ... dd[k] += 1Error: User Rate Limit Exceededd.setdefault(k, 0) += 1.
91

Operator overloading for the set builtin:

>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> a | b # Union
{1, 2, 3, 4, 5, 6}
>>> a & b # Intersection
{3, 4}
>>> a < b # Subset
False
>>> a - b # Difference
{1, 2}
>>> a ^ b # Symmetric Difference
{1, 2, 5, 6}

Более подробная информация из стандартной справочной библиотеки:Установить типы

Error: User Rate Limit Exceededdocs.python.org/tutorial/datastructures.html#sets
314

Если вам не нравится использовать пробелы для обозначения областей, вы можете использовать стиль C {}, введя:

from __future__ import braces
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded__past__Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded__cruft__Error: User Rate Limit Exceeded
168

Dictionaries have a get() method

В словарях есть "get ()"; метод. Если вы нажмете клавишу ['ключ'], а ключа нет, вы получите исключение. Если вы сделаете d.get («ключ»), вы получите «Нет», если «ключ»; там нет. Вы можете добавить второй аргумент, чтобы вернуть этот элемент вместо None, например: d.get ('key & apos ;, 0).

Это отлично подходит для таких вещей, как сложение чисел:

sum[value] = sum.get(value, 0) + 1

Error: User Rate Limit Exceededget(key, None)Error: User Rate Limit ExceededNoneError: User Rate Limit Exceeded
Error: User Rate Limit Exceededdocs.python.org/library/collections.html#collections.Counter
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
179

Context managers and the "with" Statement

Введено вПКП 343,контекстный менеджер является объектом, который действует как контекст времени выполнения для набора операторов.

Поскольку эта функция использует новые ключевые слова, она вводится постепенно: она доступна в Python 2.5 через__future__ директивы. В Python 2.6 и выше (включая Python 3) он доступен по умолчанию.

Я использовал& Quot; с & Quot; заявление много, потому что я думаю, что это очень полезная конструкция, вот короткая демонстрация:

from __future__ import with_statement

with open('foo.txt', 'w') as f:
    f.write('hello!')

Что происходит здесь за кулисами, так это то, что& Quot; с & Quot; заявление называет специальным__enter__ а также__exit__ методы на объекте файла. Сведения об исключении также передаются__exit__ если какое-либо исключение было вызвано из тела оператора with, что позволяет обрабатывать исключение там.

В данном конкретном случае это делает для вас то, что он гарантирует, что файл будет закрыт, когда выполнение выпадает из области действияwith пакет, независимо от того, происходит ли это нормально или было ли выброшено исключение. Это в основном способ абстрагирования общего кода обработки исключений.

Другие общие случаи использования для этого включают блокировку с потоками и транзакциями базы данных.

Error: User Rate Limit ExceededfutureError: User Rate Limit Exceeded
Error: User Rate Limit ExceededfutureError: User Rate Limit Exceeded
Error: User Rate Limit Exceededwiths :) with open('filea') as filea and open('fileb') as fileb: ...
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededwith open('filea') as filea, open('fileb') as fileb: ...
460

enumerate

Оберните итерируемое с enumerate, и оно даст элемент вместе с его индексом.

Например:


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>

Рекомендации:

Python tutorial—looping techniques Python docs—built-in functions—enumerate PEP 279
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededlistError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
142

Conditional Assignment

x = 3 if (y == 1) else 2

Это именно то, что звучит так: «назначить 3 для x, если y равно 1, в противном случае назначить 2 для x». Обратите внимание, что эти символы не нужны, но они мне нравятся для удобства чтения. Вы также можете связать это, если у вас есть что-то более сложное:

x = 3 if (y == 1) else 2 if (y == -1) else 1

Хотя в определенный момент это заходит слишком далеко.

Обратите внимание, что вы можете использовать if ... else в любом выражении. Например:

(func1 if y == 1 else func2)(arg1, arg2) 

Здесь func1 будет вызываться, если y равно 1, а func2 в противном случае. В обоих случаях соответствующая функция будет вызываться с аргументами arg1 и arg2.

Аналогично, действует также следующее:

x = (class1 if y == 1 else class2)(arg1, arg2)

где class1 и class2 - это два класса.

Error: User Rate Limit Exceededx = ((y == 1) ? 3 : 2)Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
222

Function argument unpacking

Вы можете распаковать список или словарь в качестве аргументов функции, используя* а также**.

Например:

def draw_point(x, y):
    # do some magic

point_foo = (3, 4)
point_bar = {'y': 3, 'x': 2}

draw_point(*point_foo)
draw_point(**point_bar)

Очень полезный ярлык, поскольку списки, кортежи и тексты широко используются в качестве контейнеров.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededshortcut.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
132

Чтобы добавить больше модулей Python (особенно сторонних), большинство людей, похоже, используют переменные среды PYTHONPATH или добавляют символические ссылки или каталоги в свои каталоги пакетов сайтов. Другой способ, это использовать * .pth файлы. Вот официальное объяснение документа Python:

"The most convenient way [to modify python's search path] is to add a path configuration file to a directory that's already on Python's path, usually to the .../site-packages/ directory. Path configuration files have an extension of .pth, and each line must contain a single path that will be appended to sys.path. (Because the new paths are appended to sys.path, modules in the added directories will not override standard modules. This means you can't use this mechanism for installing fixed versions of standard modules.)"

Error: User Rate Limit Exceeded
141
Doctest: documentation and unit-testing at the same time.

def factorial(n):
    """Return the factorial of n, an exact integer >= 0.

    If the result is small enough to fit in an int, return an int.
    Else return a long.

    >>> [factorial(n) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> factorial(-1)
    Traceback (most recent call last):
        ...
    ValueError: n must be >= 0

    Factorials of floats are OK, but the float must be an exact integer:
    """

    import math
    if not n >= 0:
        raise ValueError("n must be >= 0")
    if math.floor(n) != n:
        raise ValueError("n must be exact integer")
    if n+1 == n:  # catch a value like 1e300
        raise OverflowError("n too large")
    result = 1
    factor = 2
    while factor <= n:
        result *= factor
        factor += 1
    return result

def _test():
    import doctest
    doctest.testmod()    

if __name__ == "__main__":
    _test()
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededlocals()Error: User Rate Limit Exceededlocals().update(setUp())Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
114

Re-raising exceptions:

# Python 2 syntax
try:
    some_operation()
except SomeError, e:
    if is_fatal(e):
        raise
    handle_nonfatal(e)

# Python 3 syntax
try:
    some_operation()
except SomeError as e:
    if is_fatal(e):
        raise
    handle_nonfatal(e)

«Поднять» оператор без аргументов внутри обработчика ошибок говорит Python повторно вызвать исключениеwith the original traceback intact, позволяя вам сказать «о, извините, извините, я не хотел это уловить, извините, извините».

Если вы хотите распечатать, сохранить или использовать оригинальную трассировку, вы можете получить ее с помощью sys.exc_info (), а печать, как в Python, будет выполнена с помощью & apos; traceback & apos; модуль.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededraise eError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededexc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]Error: User Rate Limit Exceeded
339

Be careful with mutable default arguments

>>> def foo(x=[]):
...     x.append(1)
...     print x
... 
>>> foo()
[1]
>>> foo()
[1, 1]
>>> foo()
[1, 1, 1]

Вместо этого вам следует использовать значение дозорного, обозначающее «не дано» и замените его на изменчивый, который вы хотели бы использовать по умолчанию:

>>> def foo(x=None):
...     if x is None:
...         x = []
...     x.append(1)
...     print x
>>> foo()
[1]
>>> foo()
[1]
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfoo.func_defaultsError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
247

In-place value swapping

>>> a = 10
>>> b = 5
>>> a, b
(10, 5)

>>> a, b = b, a
>>> a, b
(5, 10)

Правая часть присваивания является выражением, которое создает новый кортеж. Левая часть назначения немедленно распаковывает этот (не связанный) кортеж с именамиa а такжеb.

После назначения новый кортеж не имеет ссылок и помечается для сборки мусора, а значения привязываются кa а такжеb были поменяны местами.

Как отмечено вPython учебник раздел по структурам данных,

Note that multiple assignment is really just a combination of tuple packing and sequence unpacking.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
512

Get the python regex parse tree to debug your regex.

Регулярные выражения - отличная особенность Python, но их отладка может быть проблемой, и слишком легко сделать неправильное выражение.

К счастью, python может распечатать дерево разбора регулярных выражений, передав недокументированный экспериментальный скрытый флагre.DEBUG (на самом деле, 128)re.compile.

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

Как только вы поймете синтаксис, вы сможете обнаружить свои ошибки. Там мы видим, что я забыл сбежать[] в[/font].

Конечно, вы можете комбинировать его с любыми флагами, например, с регулярными выражениями в комментариях:

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
152

Descriptors

Они - магия целого ряда основных функций Python.

Когда вы используете точечный доступ для поиска элемента (например, x.y), Python сначала ищет элемент в словаре экземпляра. Если он не найден, он ищет его в словаре классов. Если он находит его в словаре классов, и объект реализует протокол дескриптора, а не просто возвращает его, Python выполняет его. Дескриптор - это любой класс, который реализует__get__, __set__, или же__delete__ методы.

Вот как вы реализуете свою собственную (только для чтения) версию свойства, используя дескрипторы:

class Property(object):
    def __init__(self, fget):
        self.fget = fget

    def __get__(self, obj, type):
        if obj is None:
            return self
        return self.fget(obj)

и вы будете использовать его так же, как встроенное свойство ():

class MyClass(object):
    @Property
    def foo(self):
        return "Foo!"

Дескрипторы используются в Python для реализации, среди прочего, свойств, связанных методов, статических методов, методов класса и слотов. Понимание их позволяет легко понять, почему многие вещи, которые раньше были похожи на Python 'quirks & apos; они такие, какие есть.

Раймонд Хеттингер имеетотличный учебник это намного лучше описывает их, чем я.

Error: User Rate Limit ExceededpropertyError: User Rate Limit Exceeded
Error: User Rate Limit Exceededfoo = property(lambda self: self.__foo)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/101268/… )
741

Chaining comparison operators:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

В случае, если вы думаете, что это делает1 < x, который выходит какTrue, а затем сравниваяTrue < 10что такжеTrueтогда нет, это действительно не то, что происходит (см. последний пример). Это действительно переводит на1 < x and x < 10, а такжеx < 10 and 10 < x * 10 and x*10 < 100, но с меньшим набором текста и каждый термин оценивается только один раз.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded(< 1 x 10)Error: User Rate Limit Exceeded(= 10): cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…

Похожие вопросы