2012-01-18 2 views
1

Ну, я люблю Python, но нахожу в основном две вещи, которые раздражают: self и docstrings ниже деклараций.Изменить положение строки doc в коде Python

Что я хотел бы знать, как я могу иметь свои докстроны перед декларациями в моем коде? Что-то вроде:

"""Class docstring""" 
class MyClass(object): 
    "Method documentation" 
    def my_method(self): 
     pass 

Возможно, используя какой-то декоратор?

+2

Правильно: используйте '#' ;-) – Tim

+0

Допустимый ответ, если есть инструмент для правильного извлечения документации. :) –

+7

Вы будете делать себе одолжение, чтобы работать с зерном Python и не бороться с его дизайном. Просто скажите ;-) –

ответ

3

можно написать декоратор, который устанавливает __doc__ свойство:

def doc(docstr): 
    def deco(f): 
     f.__doc__ = docstr 
     return f 
    return deco 

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

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

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

def doc(docstr): 
    def deco(f): 
     if isinstance(f, type): 
      d = vars(f).copy() 
      d["__doc__"] = docstr 
      return type(f.__name__, f.__bases__, d) 
     f.__doc__ = docstr 
     return f 
    return deco 

С __doc__ доступен только для чтения, нам необходимо создать объект нового типа с требуемой документацией. Для простоты я не рассматриваю пользовательские метаклассы (если вы хотите, замените type на f.__class__ в приведенном выше коде).

Опять же, я не рекомендую использовать этот декоратор.

+1

Очень хорошо. Мне было любопытно, возможно ли легкое решение, но это повредит коммуникацию, как говорят все. :) Я постараюсь соблюдать соглашения для общения. Благодарю. –

+0

Нет проблем с назначением для класса python 2.7.2 класса '__doc__' нового стиля. – Marcin

+0

@SvenMarnach: По-видимому, классы Django, хотя классы нового стиля, могут иметь свои '__doc__'. Я не понимал, что это исключение из правила. – Marcin

1

Это не сработает. Докстрина, по определению, является строкой в ​​строке после объявления.

Если вы действительно хотите сделать это с помощью декоратора, вы можете создать декоратор, который устанавливает свойство __doc__ обернутой функции (или класса).

+1

+1 Это будет работать отлично. –

-1

Если вы действительно этого хотите, обязательно.

def doc(text): 
    def w(f): 
    f.__doc__ = text 
    return f 
    return w 
+0

Приятный и простой, но, как сказал Свен, не работает над новыми классами стиля. –

+0

@Thiago: Но он все равно будет работать над функциями независимо. –

+0

@ Игнасио: Да, он будет работать над функциями. Просто заполните «return w» после последней строки. Без него запускается исключение. Изменить: хорошо, я видел коррекцию сейчас. В качестве побочного примечания я не уменьшил его. –

2

Как вы уже предлагаете в вашем вопросе, вы могли бы сделать что-то следующим образом:

from functools import wraps 

def docstring(docstr): 
    def decorator(cls): 
     @wraps(cls) 
     def wrapper(*args, **kwargs): 
      return cls(*args, **kwargs) 
     wrapper.__doc__ = docstr 
     return wrapper 
    return decorator 

@docstring("""Class docstring""") 
class MyClass(object): 
    def my_method(self): 
     pass 

print MyClass.__doc__ # Class docstring 

Однако я не нахожу это особенно лучше, чем текущий синтаксис.

+2

Это отличает превращение 'MyClass' в функцию. Представление будет чем-то вроде '', и вы потеряете доступ к специальным атрибутам, таким как '__base__' и т. Д. –

+0

Будет ли это иметь влияние на функцию идентификации любого типа? –

+0

@ThiagoChaves: Вы имеете в виду 'isinstance()'? Это больше не сработает, и вообще не удастся извлечь из класса такой декоратор. В конце концов, этот декоратор может быть совершенно непригодным. –

Смежные вопросы