Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Как сделать документацию к функции?

#python #python_3x #python_2x #документация



Как сделать документацию к функции?
Как автоматически сохранить документацию в файл?
Также как получить документацию из какой-либо
функции?

    


Ответы

Ответ 1



Документировать функции очень важно. Это помогает не только узнать что делает функция, но и подсказывает какие именованые аргументы она принимает и что в следствии может возвращать. Документировать функции очень просто. Просто и обращаться к документации каждой функции. Чтобы создать описание функции, внутри функции перед её телом нужно сделать многострочный комментарий(делается он с помощью трёх знаков '''). Этот комментарий будет рассматриваться, как аттрибут .__doc__ и будет появляться при вызове help(), но об этом чуть позже. Давайте сделаем небольшую функцию: def to_str_smth(smth, step=1): smth = str(smth) return smth[::step] Функция есть, давайте сделаем к ней описание для тех, кто будет, например, импортировать модуль с ней. def to_str_smth(smth, step=1): """ to_str_smth(smth, step=1) Makes the input data string and return it sliced with step """ smth = str(smth) return smth[::step] Теперь вызовем нашу документацию: print(to_str_smth.__doc__) Документацию можно вызвать и с помощью команды help(), но тогда свернётся весь наш аутпут и откроется что-то типа подокна (если вы знакомы с редактором nano, то вам будет проще понять), из которого можно выйти, нажав q help(to_str_smth) Почему не вызывем документацию у to_str_smth(), указывая скобки? Потому что так функция затребует аргументы, если они обязательны. К тому же, таким образом мы можем вернуть документацию подфункции, если она указана в return. Посмотрим, например, на эту функцию: def plus(a, b): """ plus(a, b) Return a + b, typed float """ return float(a + b) Давайте попробуем вывести на экран документацию для неё, указав скобки: print(plus().__doc__) Как мы видим, функция запросила аргументы. Теперь давайте попробуем их передать и снова вызывать документацию: print(plus(2.3, 2.7).__doc__) Не совсем то, что хотелось бы видеть... Важно соблюдать одинаковое форматирование при написании документации, как и при написании кода. Ознакомиться с рекомендациями по тому, как стоит документировать функции и классы, можно в справке PEP257. Кстати, всё, что заключённо между парой ''' игнорируется интерпретатором и таким образом можно спрятать блоки кода при его тестах. Если мы хотим сохранить документацию, сделать это можно с помощью программы, которая идёт в комплекте с Python под названием pydoc. Для каждой версии есть свой pydoc, так что убедитесь, что вы запускаете ту версию pydoc'а, иначе может возникнуть конфликт импорта модулей. Сделать это можно следующим образом (подразумевается, что запуск идёт из директории с модулем): pydoc3.6 -w ./mymodule # также подойдёт pydoc -w ./mymodule.py Таким образом будет создан html файл с вашей документацией для модуля mymodule. Дизайн не очень, зато быстро. Для стартапов пойдёт. К тому же, помимо pydoc есть множество программ, которые генерируют документацию в файл. Вот некоторые из них: HappyDoc pudge epydoc Обращаясь к документации с помощью help() или .__doc__, мы можем разрешить множество вопросов, связанных с импортируемыми модулями, а документируя свой код - не забыть что он делает, возвращает и для чего он нужен спустя долгое время.

Определение пола по фио на python

#алгоритм #python_3x


Подскажите, пожалуйста, алгоритм определения пола по ФИО. Может есть на питоне какие-то
решения? Я пробовал: 1-по окончаниям;
2-с помощью pymorphy разбивал ФИО на слова и определял род каждого слова.
Есть еще какие-нить библиотеки или может алгоритм? ФИО могут быть не только русские.
    


Ответы

Ответ 1



Мой вариант - это пробегаться по базе данных и спрашивать есть ли совпадения: Сначала достанем базу данных на этом сайте В левом окне в шаге 3 выберем Russian (Cyrillic) - в правом я выбираю United States, для генерации укажем только интересующие нас поля: Gender, Given Name и Surname, саму базу сделаем самой большой: 50000 Также давайте закажем для генерации базу и для английских имён по аналогии. Процесс не быстрый, так что можно пойти заварить чаёк и выкурить сигаретку. Как придём, нам придёт 2 письма со ссылками на скачивание наших БД. Напишем код: import pandas as pd dfru = pd.read_csv('FNru.csv') dfen = pd.read_csv('FNen.csv') # создадим сеты, чтобы не бегать по одному и тому же item'у rumalenames = set(dfru[dfru['Gender'] == 'male']['GivenName']) rumalesurnames = set(dfru[dfru['Gender'] == 'male']['Surname']) rufemalenames = set(dfru[dfru['Gender'] == 'female']['GivenName']) rufemalesurnames = set(dfru[dfru['Gender'] == 'female']['Surname']) enmalenames = set(dfen[dfen['Gender'] == 'male']['GivenName']) enmalesurnames = set(dfen[dfen['Gender'] == 'male']['Surname']) enfemalenames = set(dfen[dfen['Gender'] == 'female']['GivenName']) enfemalesurnames = set(dfen[dfen['Gender'] == 'female']['Surname']) name = input('Name: ') surname = input('Surname: ') if name in rumalenames and surname in rumalesurnames: print(name, surname, 'is male') elif name in rufemalenames and surname in rufemalesurnames: print(name, surname, 'is female') elif name in enmalenames and surname in enmalesurnames: print(name, surname, 'is male') elif name in enfemalenames and surname in enfemalesurnames: print(name, surname, 'is female') else: print('Unkown data') Давайте протестируем что у нас получилось на нескольких входных данных: # Name: Никита # Surname: Токарев # Никита Токарев is male # Name: Ольга # Surname: Соколова # Ольга Соколова is female # Name: Жанна # Surname: Токарева # Жанна Токарева is female # Name: Carolina # Surname: Thompson # Carolina Thompson is female # Name: Mark # Surname: Watson # Mark Watson is male # Но решение не идеально, конечно # Требуется либо очень много данных, либо очень хорошая БД # И то не факт, что все имена будут включены # Name: Олег # Surname: Волоков # Unkown data # Name: Ashley # Surname: Roth # Unknown data

Ответ 2



Также для определения пола по фио можно использовать нейронную сеть. Пример можно взять здесь: https://github.com/Rai220/MlSexDetector Пример работы: Input name: Владимир Путин Sex: М [[ 4.24729733e-05 9.96808589e-01 3.14901001e-03]] Input name: Любовь Петрова Sex: Ж [[ 3.94746803e-06 7.50368787e-03 9.92492378e-01]] Input name: Полад Бюльбюль оглы Sex: М [[ 0.00102036 0.97395748 0.0250222 ]] Input name: Кто Где Sex: unknown [[ 9.99970675e-01 2.07114244e-05 8.59489865e-06]]

Ответ 3



Можно воспользоваться pymorphy2 для определения пола по имени: name_list = ['Константин', 'Виктор', 'Любовь', 'Дамир', 'Венера', 'Таисия', 'Алёна', 'Евгений', 'Егор', 'Никита'] # pip install pymorphy2 import pymorphy2 morph = pymorphy2.MorphAnalyzer() for name in name_list: parsed_word = morph.parse(name)[0] print('{:<15} {}'.format(name, parsed_word.tag.gender)) Результат: Константин masc Виктор masc Любовь femn Дамир masc Венера femn Таисия femn Алёна femn Евгений masc Егор masc Никита masc PS. У некоторых имен есть ё (например, Алёна), которая часто заменяется на е, поэтому такие имена может библиотека неправильно определить. Например, скажет что Алена это мужского пола. PPS. Метод morph.parse возвращает список, т.к. у одного слова может выдать несколько вариантов разбора. Например, для Алена мне выдало несколько вариантов, и один из них был Алена, другой Алёна. Поэтому для своего скрипта я добавлял проверку с заменой е -> ё.

Как найти местоположение модуля Python?

#python #python_3x


Скрипт на Python использует некий модуль. С помощью какой команды можно найти его
местоположение на диске машины?
    


Ответы

Ответ 1



module.__file__ В общем случае, модуль на Питоне не обязан быть в файле на диске. Модуль может быть в zip-архиве, налету создаваться. В зависимости от того зачем вам нужен путь к модулю, есть разные API (наивный обход директорий из sys.path не нужен и может быть недостаточным). К примеру: Можно ли загрузить содержимое модулей пакета, если __init__ пуст? или чтобы ресурсы получить, лежащие в директории с модулем: Текущая директория в Python.

Ответ 2



import some_module import sys import os for path in sys.path: if os.path.exists(os.path.join(path, 'some_module')): print('some_module is here: {}'.format(path)) "Трюк" здесь заключается в том, что где бы интерпретатор не встретил строку from somewhere import something он ищет somewhere в sys.path. И если не находит - выбрасывается исключение ImportError. При этом при запуске интерпретатора, текущий путь (или при запуске скрипта python path/to/script.py путь path/to) добавляется в sys.path. 2-й вариант (попроще): import some_module print(some_module.__file__) >>> import openpyxl >>> print (openpyxl.__file__) D:\Python\lib\site-packages\openpyxl-2.3.0_b1-py2.7.egg\openpyxl\__init__.pyc >>> Но 2-й вариант можно "обмануть", явно определив в модуле переменную __file__

CheckBox с тремя состояниями

#c_sharp #wpf #xaml #mvvm #checkbox


Возможно ли создать CheckBox с тремя состояниями: не установлено, включено, исключено?
Что-то вроде того, что ниже: 
 
 
 
    


Ответы

Ответ 1



Есть свойство специально для этого IsThreeState MainWindow.xaml MainWindowXaml.cs public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void CheckBox_Indeterminate(object sender, RoutedEventArgs e) { this.Title = "Неопределено"; } private void CheckBox_Checked(object sender, RoutedEventArgs e) { this.Title = "Выбран"; } private void CheckBox_Unchecked(object sender, RoutedEventArgs e) { this.Title = "Не выбран"; } } Если нужно с картинками, задаем свой стиль

Ответ 2



Возможно, определите свой стиль. Пример: Источник Привязку чекбокса нужно сделать к Nullable полю типа bool?.

Ответ 3



мне как то понадобился CheckBox с тремя состояниями для вставки в дерево в итоге сложный переключатель и возможность использовать доп пояснение, кликабельное

Переменная = empty

#cpp #инициализация #объявление


Можно ли в c++ новосозданной переменной присвоить значение empty?
    


Ответы

Ответ 1



В C++ 17 имеется класс std::optional - обертка вокруг других объектов, который позволяет определять, есть ли значение у переменной или нет. Однако многие компиляторы еще не поддерживают этот класс. Поэтому для фундаментальных типов нет такого значения, как empty. Вы можете переменные этих типов инициализировать нулем, как это делает компилятор для статических переменных. Тем не менее нельзя сказать, что такие значения являются значением empty.

Ответ 2



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

На С++ при выводе строки стринг в файл, записывает крякозябры

#cpp #файлы #строки #вывод


Короче, по условиям надо записывать строку в файл, если такой там нет, записать,
в противном случае, ничего не делать. Вот решил, но выдает в файл крякозябры. Первая
функция для определения количества строк в файле, там все окей работает)))

#include 
#include 
#include 
#include 
#include 

using namespace std;

int dlina(){
    char *str = new char [1024];
    int i=0;
    ifstream base("1.txt");
    while (!base.eof())
    {
        base.getline(str, 1024, '\n');
        i++;
    }
    base.close();
    delete str;
    return i;

}

int main() {
    string a;
    string b;

    ifstream fin("2.txt");

    FILE *f;
    f= fopen("2.txt", "a+");
        cin>> a;

    int len,len1;

    len1=a.length();
    len=dlina();

    bool l=false;   

    for (int i=0; i>b; 

        if(a==b) l=true;
    }

    if(l==false) {
    fwrite(&a,sizeof(string),1,f);
    }
    fin.close();
    //fclose(f);
    return 0;

}

    


Ответы

Ответ 1



записывать с++ строки с помощью с функций вот таким способом fwrite(&a,sizeof(string),1,f); нельзя. Будет писаться совсем не то, что Вы ожидаете. Даже банальная логика подсказывает, что 'sizeof(string)' не зависит от данных, которые находятся в строке. Если Вам нужно записать именно std::string в файл таким способом, делайте так fwrite(a.c_str(),(a.length()+1),1,f); P.S. если пишите на с++, то лучше использовать функции с++.

Как дату в формате “27 мар 17, 11:03” перевести в Timestamp?

#java


У меня есть необходимость даты в строковом формате в виде "27 мар 17, 11:03" перевести
в java.sql.Timestamp. И очень хочется сделать это без костылей. Подскажите пожалуйста
может быть вы знаете какой-то библиотечный способ это сделать, ну или может если не
совсем библиотечный, то близко к нему. Спасибо.
    


Ответы

Ответ 1



Можно воспользоваться классом SimpleDateFormat: String dateStr = "27 мар 17, 11:03"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd MMM yy, HH:mm"); Timestamp timestamp = new Timestamp(simpleDateFormat.parse(dateStr).getTime());