Как Вы разрабатываете главные и незначительные комментарии?

Panda - довольно мощная и интеллектуальная библиотека, читающая CSV в Python

. Простой пример здесь. У меня есть файл example.zip с четырьмя файлами в нем.

EXAMPLE.zip
 -- example1.csv
 -- example1.txt
 -- example2.csv
 -- example2.txt

from zipfile import ZipFile
import pandas as pd


filepath = 'EXAMPLE.zip'
file_prefix = filepath[:-4].lower()

zipfile = ZipFile(filepath)
target_file = ''.join([file_prefix, '/', file_prefix, 1 , '.csv'])

df = pd.read_csv(zipfile.open(target_file))

print(df.head()) # print first five row of csv
print(df[COL_NAME]) # fetch the col_name data

Как только у вас есть данные, вы можете манипулировать воспроизведением со списком или другими форматами.

7
задан Jeremy Ruten 1 January 2009 в 15:06
поделиться

12 ответов

Я использую многострочные комментарии для 'главных' комментариев:

/*
 * yada yada yada
 */

И использование одна строка комментирует для незначительных.

я знаю, что некоторым людям не нравится использовать/* */комментарии стиля, потому что он мешает автоматически комментировать и не комментировать блоки..., но мне нравится, как они смотрят, и я твердо уверенным, которого код должен быть эстетически приятен считать.

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

/**
 * detailed description ...
 */

code

// -- minor comment
code

code
// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
4
ответ дан 6 December 2019 в 23:14
поделиться
// Major comment
// -------------
...

// Minor comment
...

... // Minor comment (end of line)
2
ответ дан 6 December 2019 в 23:14
поделиться

Я использую что-то вроде этого, чтобы заставить его больше походить на "заголовок" или разделитель для следующего блока кода:

// ***** Major comment *****

// Minor comment
...

// Minor comment 2
...

, Конечно, который предполагает, что "главный комментарий" является только несколькими словами

1
ответ дан 6 December 2019 в 23:14
поделиться

Я поместил главные комментарии выше кода (блок), которому предшествует пустая строка, и иногда во всем верхнем регистре. Незначительные комментарии я отложил направо, расположенный с отступом к столбцу 81 для избавлений от них кода. Оба из них использование//.

Для алгоритмических "дискурсов" я использую/* */как так:

/*
 * This is a long discourse on the code which follows it, usually
 * placed at the beginning of a method and containing information
 * which is not appropriate for the doc comments.
 */
1
ответ дан 6 December 2019 в 23:14
поделиться

Я думаю различие между "основными" и "незначительными" остальными частями комментариев на структурах программы, к которым они присоединяются. Например, я рассматриваю метод - или комментарии для документации уровня класса столь же "главный" и блок - или комментарии линейного уровня как "незначительный":

/**
 * This is major comment describing the method
 */
public void foo() {
    if (...) {
        // minor comment describing block
        ...
        doSomething(); // minor comment describing line
    }
}

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

1
ответ дан 6 December 2019 в 23:14
поделиться

Это все симпатично C центральный здесь. В C/C++ я склонен писать

/* file -- what it is -*-emacs magic-*- */

Как первая строка.

/*
 * Block comments like this
 */

if( I need a comment on a code block) {
   /* I tend to write them like this */
   x = x + 1 ;                        /* ... and write my */
                                      /* line comments so */
}

я обычно резервирую // comments для внутреннего кода и сохраняю старые добрые комментарии BSD к комментариям блока.

В Lisp

;;;; Four semicolons for "file-scope" comments

;;; Three for block comments over a large chunk of code

(defun quux (foo bar)
    "Don't forget your docstrings, folks"
    ;; but big code comments get two semicolons
    (let ((a 1)
          (b 2))                      ; and only one semicolon
          (+ a b)))                   ; means an in-line comment.

# comment languages like Python and Ruby
# Have to live with one style of comment.
def quux(a,b):
    return a + b                          # poor neglected things.
1
ответ дан 6 December 2019 в 23:14
поделиться

Я обычно комментирую блоки кода с помощью /* */ наверху каждого раздела. Я не использую встроенные комментарии кроме специального curcumstances (например, хитрый код), потому что я чувствую, что комментарии "скрыты", и код мог быть расширен позже, и комментариями нужно будет микроуправлять. Например:

int parseEverything()
{
    /* Initialize the parser. */
    random_code_here();

    still_more_init();
        /// (Note: the above line still falls under the init section, even if it's separated by a newline.)

    /* Main parser loop. */
    while(!done_parsing) {
        /* Grab the token. */
        if(x) {
            /* Preprocessor stuff. */
            y();
        } else {
            /* Normal token. */
            z();
        }

        /* Insert into tree. */
        make_tree_node();
        insert_into_tree();

        /* Move to next token. */
        ++streamPtr;
            /// (Note: the above could be expanded to take up multiple lines, thus
            ///        if an inline comment were used it'd have to be moved, if
            ///        you even remember there's a comment there.)
    }

    clean_up();
}

, Конечно, если код очевиден, он не был должен требовать комментарий, как в clean_up(). Включая комментарий не причиняет боль очень, хотя, и, если расширено позже было бы легче знать, куда поместить дополнительный код очистки.

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

Наиболее вероятный каждый раздел призывает к своему собственному [набор] функций, таким образом, ясно, что Вы, возможно, должны осуществить рефакторинг, если разделы становятся большими.

я должен добавить, что форматирую многострочные комментарии как таковые (мой "IDE" (Vim) вставляет * в каждой строке для меня со сценариями по умолчанию (для моего дистрибутива), который удобен):

/*
 * This is a comment which normally would be on one line, but is either split into multiple
 * lines for emphasis or so we don't have 160-character hard-to-read comments everywhere.
 */

кроме того, я комментарий #else и #endif:

#ifndef FOO_H
#define FOO_H

#ifdef DEBUG
#else   /* DEBUG */
#endif  /* !DEBUG */

#endif  /* FOO_H */

, Но это добирается немного вне темы.

(#include защита не требует not (!) предшествовать им, потому что их использование очевидно, и это - традиция. =])

1
ответ дан 6 December 2019 в 23:14
поделиться
// A plate is displayed if a WorkFlowStepUpdate message is received
// whose:
//        * Change_Type is License_No
//        * Event_Type is GA, NA, or NG
//        * New_Value is non-null and non-blank
//        * Inspection_DateTime<(NOW-TimeInMinutesBeforeExpiringDisplaySignMessage)
//
// A plate is removed:
//         * if it has been displayed for TimeInMinutesBefore...
//         * a GA, NA, or NG CloseEvent is received  whose New_Value matches
//           a displayed plate
//
// If a plate is to be added to a full screen, the oldest plate on the display
// is removed to make room for the new plate.


.
.
.
.
.



// Record the ping status of each IP device
foreach (string s in th.Keys)
        {
        // We don't know if this is a wks or svr.
        // But we can rely on 0 being bad, and we'll
        // get the 'proper' state enumeration down in GetsOHInfo
        // 
        if (IsItLive(s)) IPStates[s] = 1;
        else IPStates[s] = 0;
        IPTimes[s] = System.DateTime.Now.ToUniversalTime();
        }
0
ответ дан 6 December 2019 в 23:14
поделиться

Главный комментарий

/***  Function - fooBar()  ****************************
** Description                                       **
**    does the flooble using the bardingle algorithm **
**      with the flinagle modification               **
** Pre-condition                                     **
**    all moths are unballed                         **
** Post-condition                                    **
**    all moths are balled                           **
******************************************************/
void fooBar( int foo ) {
    ...
    ...
}

/***  Function - fooBar() END  ***********************/

Незначительный комментарий

// note cast to int to ensure integer maths result
int i = (int)y / (int)x;
0
ответ дан 6 December 2019 в 23:14
поделиться
// Top-level (major) comment
theThing=doSomething();
    // - Second-level (minor) comment
    anotherThing=doSomethingWith(theThing);
        // - - Third-level (minor-minor?) comment
        yetAnotherThing=doSomethingWith(anotherThing);
    // - Back to second level
    destroy(anotherThing);
// Back to first level
helloWorld();

, Конечно, прием identation не применяется, когда синтаксис не позволяет его (чтение: Python)

0
ответ дан 6 December 2019 в 23:14
поделиться

Я сделал бы это как это возможно:

// Here we do it
//
// So, be aware this text is just to make a silly
// long comment to show how it would look like 
// in real code. 
doTheRealThing();

// and this is another thingy
doOtherThing();

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

// prepare for party
doIt();

// Here we do it
//
{
    // So, be aware this text is just to make a silly
    // long comment to show how it would look like 
    // in real code. 
    doTheRealThing();

    // and this is another thingy
    doOtherThing();
}

// another code that is not really affected by the comment
// above
die();

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

/**
 * This function will return the current object.
 *
 * And now it follows the normal long stuff that's again
 * a bit stretched to fill space...
 */
Object getCurrentObject();

Для некомментария диапазонов кода, я явно делаю не использование те комментарии, поскольку я резервирую их только к коду документа. Я собираюсь использовать

#if 0
    Code in Here that's disabled
#endif

, И это также сохранит меня от наличия некоторого материала, который не является действительным кодом C++ (материал, промежуточный, те разделители все еще должны содержать допустимые маркеры). Я не уверен, как вопрос находится в C# об этом, все же.

0
ответ дан 6 December 2019 в 23:14
поделиться

Это - мое предпочтение стиля комментария:

/**
 * This is a comment explaining
 * what this method is actually doing
 */
public void foo()
{
    // this is a simple comment
    doSomething();

    // this is a special comment
    // explaining thoroughly what I'm doing
    // using as many words as possible
    // to be the most concise
    doSomethingSpecial();
}
0
ответ дан 6 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

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