SIP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C / C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдирд╛ред рднрд╛рдЧ 2

рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ , рд╣рдордиреЗ C рдФрд░ C ++ рдореЗрдВ рд▓рд┐рдЦреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП SIP рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдкрд░рдЦреАрдВред рд╣рдордиреЗ рдЙрди рдореВрд▓ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдПрд╕рдЖрдИрдкреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЕрдм рддрдХ, рд╣рдордиреЗ рд╕реА рдореЗрдВ рд▓рд┐рдЦреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреА рд╣реИред рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рд╕реА ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреМрди рд╕реА рддрдХрдиреАрдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рд╣рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред

рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЬреАрдердм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: https://github.com/Jenyay/sip-exexples ред

C ++ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдирд╛


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг, рдЬрд┐рд╕реЗ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, pyfoo_cpp_01 рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИ ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд░реЗрдВрдЧреЗред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрднреА рднреА foo рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд░рд╣рддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рд╣реЛрддреА рд╣реИ - Foo ред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ foo.h рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

#ifndef FOO_LIB
#define FOO_LIB

class Foo {
    private:
        int _int_val;
        char* _string_val;
    public:
        Foo(int int_val, const char* string_val);
        virtual ~Foo();

        void set_int_val(int val);
        int get_int_val();

        void set_string_val(const char* val);
        char* get_string_val();
};

#endif

рдпрд╣ рдПрдХ рд╕рд░рд▓ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдк рдЗрдВрдЯ рдФрд░ рдЪрд╛рд░ * рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдФрд░ рд░рд┐рдЯрд░реНрди рдХрд░рддреЗ рд╣реИрдВ ред рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

#include <string.h>

#include "foo.h"

Foo::Foo(int int_val, const char* string_val): _int_val(int_val) {
    _string_val = nullptr;
    set_string_val(string_val);
}

Foo::~Foo(){
    delete[] _string_val;
    _string_val = nullptr;
}

void Foo::set_int_val(int val) {
    _int_val = val;
}

int Foo::get_int_val() {
    return _int_val;
}

void Foo::set_string_val(const char* val) {
    if (_string_val != nullptr) {
        delete[] _string_val;
    }

    auto count = strlen(val) + 1;
    _string_val = new char[count];
    strcpy(_string_val, val);
}

char* Foo::get_string_val() {
    return _string_val;
}

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлреВ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлреВ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ main.cpp рдлрд╛рдЗрд▓ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ :

#include <iostream>

#include "foo.h"

using std::cout;
using std::endl;

int main(int argc, char* argv[]) {
    auto foo = Foo(10, "Hello");
    cout << "int_val: " << foo.get_int_val() << endl;
    cout << "string_val: " << foo.get_string_val() << endl;

    foo.set_int_val(0);
    foo.set_string_val("Hello world!");

    cout << "int_val: " << foo.get_int_val() << endl;
    cout << "string_val: " << foo.get_string_val() << endl;
}

рдлреВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдХрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ :

CC=g++
CFLAGS=-c -fPIC
DIR_OUT=bin

all: main

main: main.o libfoo.a
    $(CC) $(DIR_OUT)/main.o -L$(DIR_OUT) -lfoo -o $(DIR_OUT)/main

main.o: makedir main.cpp
    $(CC) $(CFLAGS) main.cpp -o $(DIR_OUT)/main.o

libfoo.a: makedir foo.cpp
    $(CC) $(CFLAGS) foo.cpp -o $(DIR_OUT)/foo.o
    ar rcs $(DIR_OUT)/libfoo.a $(DIR_OUT)/foo.o

makedir:
    mkdir -p $(DIR_OUT)

clean:
    rm -rf $(DIR_OUT)/*

рд╕реЗ рдЕрдВрддрд░ Makefile рд╕реЗ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореЗрдВ рдЬреАрд╕реАрд╕реА рдХреЗ рд▓рд┐рдП рдЬреА ++ , рдХрд┐ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ -fPIC рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ , рдЬреЛ рд╕рдВрдХрд▓рдХ рдмрддрд╛рддрд╛ рд╣реИ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ (рддрдерд╛рдХрдерд┐рдд "рд╕реНрдерд┐рддрд┐ рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб") рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЛрдб рдбрд╛рд▓рдиреЗ рдХреАред рдЪреВрдВрдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╕рдВрдХрд▓рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

рдЖрдЗрдП рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдмрд╛рдВрдзрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред Pyproject.toml рдФрд░ project.py рдлрд╛рдЗрд▓реЗрдВ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд▓рдЧрднрдЧ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИрдВред рдпрд╣рд╛рдБ рдЕрдм pyproject.toml рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ :

[build-system]
requires = ["sip >=5, <6"]
build-backend = "sipbuild.api"

[tool.sip.metadata]
name = "pyfoocpp"
version = "0.1"
license = "MIT"

[tool.sip.bindings.pyfoocpp]
headers = ["foo.h"]
libraries = ["foo"]

рдЕрдм C ++ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ pyfoocpp Python рдкреИрдХреЗрдЬ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ , рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред Project.py

рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд░рд╣рддрд╛ рд╣реИ pyfoo_c_04 рдЙрджрд╛рд╣рд░рдг :

import os
import subprocess

from sipbuild import Project

class FooProject(Project):
    def _build_foo(self):
        cwd = os.path.abspath('foo')
        subprocess.run(['make'], cwd=cwd, capture_output=True, check=True)

    def build(self):
        self._build_foo()
        super().build()

    def build_sdist(self, sdist_directory):
        self._build_foo()
        return super().build_sdist(sdist_directory)

    def build_wheel(self, wheel_directory):
        self._build_foo()
        return super().build_wheel(wheel_directory)

    def install(self):
        self._build_foo()
        super().install()

рдФрд░ рдпрд╣рд╛рдВ рд╣рдо pyfoocpp.sip рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ: рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд░реНрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреНрдпрд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрджрд┐ред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП .sip рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХреБрдЫ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░, рдирдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдореВрд▓ рдХрдХреНрд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рдереЗред рдЙрдиред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ .sip рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред Pyfoocpp.sip рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдо рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирдП рдирд┐рд░реНрджреЗрд╢ рджреЗрдЦреЗрдВрдЧреЗред

рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:

%Module(name=foocpp, language="C++")
%DefaultEncoding "UTF-8"

class Foo {
    %TypeHeaderCode
    #include <foo.h>
    %End

    public:
        Foo(int, const char*);

        void set_int_val(int);
        int get_int_val();

        void set_string_val(const char*);
        char* get_string_val();
};

рдкрд┐рдЫрд▓реА рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред % рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ, рд╣рдо рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рдХреЗ рдирд╛рдо рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЕрд░реНрдерд╛рдд, рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрдпрд╛рдд рдлрд╝реЛрдХреЙрдк рдпрд╛ рдлрд╝реЛрдХреЙрдк рдЖрдпрд╛рдд рд╕реЗ ... рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдЙрд╕реА рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ, рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╛рд╖рд╛ рд╣реИред -ред рд╕реА ++ % рдирд┐рд░реНрджреЗрд╢ DefaultEncoding рд╕реЗрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЬрдЧрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЪрд╛рд░ , рд╕реНрдерд┐рд░рд╛рдВрдХ рдЪрд╛рд░ , рдЪрд╛рд░ * рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЪрд╛рд░ * рдкреНрд░рдХрд╛рд░ ред

рддрдм рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдШреЛрд╖рдгрд╛ рдлреВ рд╡рд░реНрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХреЗ рддрддреНрдХрд╛рд▓ рдмрд╛рдж рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рджред рдлреВ рд╡рд░реНрдЧрдЕрднреА рднреА % TypeHeaderCode рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рдЬреЛ % End рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ ред % TypeHeaderCode рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рд╣реИ рдХрд┐ рд╕реА ++ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╛рдгреА рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХреЗ рд╕рд╛рде рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж, рдкрд╛рдпрдереЙрди рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдлреВ рдХрдХреНрд╖рд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рддрд░реАрдХреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рдпрдерди рдореЗрдВ рдлреВ рд╡рд░реНрдЧ рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдВрдЧреЗ (рдЪреВрдВрдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдИ рдирд┐рдЬреА рдФрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИрдВ)ред рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ % DefaultEncoding рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдлрд┐рд░ рдЙрди рддрд░реАрдХреЛрдВ рдореЗрдВ рдЬреЛ рдЯрд╛рдЗрдк рдХреЙрдиреНрд╕реНрдЯ рдЪрд░ * рдХреЗ рддрд░реНрдХ рд▓реЗрддреЗ рд╣реИрдВ , рдЖрдк рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рдпрдерди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рд╣рдореЗрдВ рдмрд╕ pyfoocpp Python рдкреИрдХреЗрдЬ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдкреВрд░реНрдг-рдкрд╣рд┐рдпрд╛ рдкрд╣рд┐рдпрд╛ рдкреИрдХреЗрдЬ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП sip-build рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ SIP рдмрд╛рдж рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛, рдФрд░ рдкрд╛рдпрдерди рдХреЛрдб рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рдорд╛рди рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдКрдкрд░ sip-build рдХрдорд╛рдВрдб рдХреЛ pyfoo_cpp_01 рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:

рдирд┐рд░реНрдорд╛рдг
Pp рдлреВрдХреЛрдк
    тФЬтФАтФА apiversions.c
    тФЬтФАтФА array.c
    тФЬтФАтФА array.h
    тФЬтФАтФА bool.cpp
    тФЬтФАтФА build
    тФВ   тФФтФАтФА temp.linux-x86_64-3.8
    тФВ       тФЬтФАтФА apiversions.o
    тФВ       тФЬтФАтФА array.o
    тФВ       тФЬтФАтФА bool.o
    тФВ       тФЬтФАтФА descriptors.o
    тФВ       тФЬтФАтФА int_convertors.o
    тФВ       тФЬтФАтФА objmap.o
    тФВ       тФЬтФАтФА qtlib.o
    тФВ       тФЬтФАтФА sipfoocppcmodule.o
    тФВ       тФЬтФАтФА sipfoocppFoo.o
    тФВ       тФЬтФАтФА siplib.o
    тФВ       тФЬтФАтФА threads.o
    тФВ       тФФтФАтФА voidptr.o
    тФЬтФАтФА descriptors.c
    тФЬтФАтФА foocpp.cpython-38-x86_64-linux-gnu.so
    тФЬтФАтФА int_convertors.c
    тФЬтФАтФА objmap.c
    тФЬтФАтФА qtlib.c
    тФЬтФАтФА sipAPIfoocpp.h
    тФЬтФАтФА sipfoocppcmodule.cpp
    тФЬтФАтФА sipfoocppFoo.cpp
    тФЬтФАтФА sip.h
    тФЬтФАтФА sipint.h
    тФЬтФАтФА siplib.c
    тФЬтФАтФА threads.c
    тФФтФАтФА voidptr.c


рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, sipfoocppFoo.cpp рдлрд╝рд╛рдЗрд▓ рдкрд░ рдзреНрдпрд╛рдирдкреВрд░реНрд╡рдХ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ):

/*
 * Interface wrapper code.
 *
 * Generated by SIP 5.1.1
 */

#include "sipAPIfoocpp.h"

#line 6 "/home/jenyay/temp/2/pyfoocpp.sip"
    #include <foo.h>
#line 12 "/home/jenyay/temp/2/build/foocpp/sipfoocppFoo.cpp"

PyDoc_STRVAR(doc_Foo_set_int_val, "set_int_val(self, int)");

extern "C" {static PyObject *meth_Foo_set_int_val(PyObject *, PyObject *);}
static PyObject *meth_Foo_set_int_val(PyObject *sipSelf, PyObject *sipArgs)
{
    PyObject *sipParseErr = SIP_NULLPTR;

    {
        int a0;
         ::Foo *sipCpp;

        if (sipParseArgs(&sipParseErr, sipArgs, "Bi", &sipSelf, sipType_Foo, &sipCpp, &a0))
        {
            sipCpp->set_int_val(a0);

            Py_INCREF(Py_None);
            return Py_None;
        }
    }

    /* Raise an exception if the arguments couldn't be parsed. */
    sipNoMethod(sipParseErr, sipName_Foo, sipName_set_int_val, doc_Foo_set_int_val);

    return SIP_NULLPTR;
}

PyDoc_STRVAR(doc_Foo_get_int_val, "get_int_val(self) -> int");

extern "C" {static PyObject *meth_Foo_get_int_val(PyObject *, PyObject *);}
static PyObject *meth_Foo_get_int_val(PyObject *sipSelf, PyObject *sipArgs)
{
    PyObject *sipParseErr = SIP_NULLPTR;

    {
         ::Foo *sipCpp;

        if (sipParseArgs(&sipParseErr, sipArgs, "B", &sipSelf, sipType_Foo, &sipCpp))
        {
            int sipRes;

            sipRes = sipCpp->get_int_val();

            return PyLong_FromLong(sipRes);
        }
    }

    /* Raise an exception if the arguments couldn't be parsed. */
    sipNoMethod(sipParseErr, sipName_Foo, sipName_get_int_val, doc_Foo_get_int_val);

    return SIP_NULLPTR;
}

PyDoc_STRVAR(doc_Foo_set_string_val, "set_string_val(self, str)");

extern "C" {static PyObject *meth_Foo_set_string_val(PyObject *, PyObject *);}
static PyObject *meth_Foo_set_string_val(PyObject *sipSelf, PyObject *sipArgs)
{
    PyObject *sipParseErr = SIP_NULLPTR;

    {
        const char* a0;
        PyObject *a0Keep;
         ::Foo *sipCpp;

        if (sipParseArgs(&sipParseErr, sipArgs, "BA8", &sipSelf, sipType_Foo, &sipCpp, &a0Keep, &a0))
        {
            sipCpp->set_string_val(a0);
            Py_DECREF(a0Keep);

            Py_INCREF(Py_None);
            return Py_None;
        }
    }

    /* Raise an exception if the arguments couldn't be parsed. */
    sipNoMethod(sipParseErr, sipName_Foo, sipName_set_string_val, doc_Foo_set_string_val);

    return SIP_NULLPTR;
}

PyDoc_STRVAR(doc_Foo_get_string_val, "get_string_val(self) -> str");

extern "C" {static PyObject *meth_Foo_get_string_val(PyObject *, PyObject *);}
static PyObject *meth_Foo_get_string_val(PyObject *sipSelf, PyObject *sipArgs)
{
    PyObject *sipParseErr = SIP_NULLPTR;

    {
         ::Foo *sipCpp;

        if (sipParseArgs(&sipParseErr, sipArgs, "B", &sipSelf, sipType_Foo, &sipCpp))
        {
            char*sipRes;

            sipRes = sipCpp->get_string_val();

            if (sipRes == SIP_NULLPTR)
            {
                Py_INCREF(Py_None);
                return Py_None;
            }

            return PyUnicode_FromString(sipRes);
        }
    }

    /* Raise an exception if the arguments couldn't be parsed. */
    sipNoMethod(sipParseErr, sipName_Foo, sipName_get_string_val, doc_Foo_get_string_val);

    return SIP_NULLPTR;
}

/* Call the instance's destructor. */
extern "C" {static void release_Foo(void *, int);}
static void release_Foo(void *sipCppV, int)
{
    delete reinterpret_cast< ::Foo *>(sipCppV);
}

extern "C" {static void dealloc_Foo(sipSimpleWrapper *);}
static void dealloc_Foo(sipSimpleWrapper *sipSelf)
{
    if (sipIsOwnedByPython(sipSelf))
    {
        release_Foo(sipGetAddress(sipSelf), 0);
    }
}

extern "C" {static void *init_type_Foo(sipSimpleWrapper *, PyObject *, 
                 PyObject *, PyObject **, PyObject **, PyObject **);}
static void *init_type_Foo(sipSimpleWrapper *, PyObject *sipArgs, PyObject *sipKwds,
                                   PyObject **sipUnused, PyObject **, PyObject **sipParseErr)
{
     ::Foo *sipCpp = SIP_NULLPTR;

    {
        int a0;
        const char* a1;
        PyObject *a1Keep;

        if (sipParseKwdArgs(sipParseErr, sipArgs, sipKwds, SIP_NULLPTR, sipUnused, "iA8", &a0, &a1Keep, &a1))
        {
            sipCpp = new  ::Foo(a0,a1);
            Py_DECREF(a1Keep);

            return sipCpp;
        }
    }

    {
        const  ::Foo* a0;

        if (sipParseKwdArgs(sipParseErr, sipArgs, sipKwds, SIP_NULLPTR, sipUnused, "J9", sipType_Foo, &a0))
        {
            sipCpp = new  ::Foo(*a0);

            return sipCpp;
        }
    }

    return SIP_NULLPTR;
}

static PyMethodDef methods_Foo[] = {
    {sipName_get_int_val, meth_Foo_get_int_val, METH_VARARGS, doc_Foo_get_int_val},
    {sipName_get_string_val, meth_Foo_get_string_val, METH_VARARGS, doc_Foo_get_string_val},
    {sipName_set_int_val, meth_Foo_set_int_val, METH_VARARGS, doc_Foo_set_int_val},
    {sipName_set_string_val, meth_Foo_set_string_val, METH_VARARGS, doc_Foo_set_string_val}
};

PyDoc_STRVAR(doc_Foo, "\1Foo(int, str)\n"
"Foo(Foo)");

sipClassTypeDef sipTypeDef_foocpp_Foo = {
    {
        -1,
        SIP_NULLPTR,
        SIP_NULLPTR,
        SIP_TYPE_CLASS,
        sipNameNr_Foo,
        SIP_NULLPTR,
        SIP_NULLPTR
    },
    {
        sipNameNr_Foo,
        {0, 0, 1},
        4, methods_Foo,
        0, SIP_NULLPTR,
        0, SIP_NULLPTR,
        {SIP_NULLPTR, SIP_NULLPTR, SIP_NULLPTR, SIP_NULLPTR, SIP_NULLPTR,
         SIP_NULLPTR, SIP_NULLPTR, SIP_NULLPTR, SIP_NULLPTR, SIP_NULLPTR},
    },
    doc_Foo,
    -1,
    -1,
    SIP_NULLPTR,
    SIP_NULLPTR,
    init_type_Foo,
    SIP_NULLPTR,
    SIP_NULLPTR,
    SIP_NULLPTR,
    SIP_NULLPTR,
    dealloc_Foo,
    SIP_NULLPTR,
    SIP_NULLPTR,
    SIP_NULLPTR,
    release_Foo,
    SIP_NULLPTR,
    SIP_NULLPTR,
    SIP_NULLPTR,
    SIP_NULLPTR,
    SIP_NULLPTR,
    SIP_NULLPTR,
    SIP_NULLPTR
};

рдЕрдм рд╕рд┐рдк-рд╡реНрд╣реАрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрдХреЗрдЬ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ ред рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ pyfoocpp-0.1-cp38-cp38-manylinux1_x86_64.whl рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рдкрд┐рдк рдЗрдВрд╕реНрдЯреЙрд▓ --user pyfoocpp-0.1-cp38-cp38-manylinux1_x86_64.whl рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдЪрд▓рд╛рдПрдВ:

>>> from foocpp import Foo
>>> x = Foo(10, 'Hello')

>>> x.get_int_val()
10

>>> x.get_string_val()
'Hello'

>>> x.set_int_val(50)
>>> x.set_string_val('')

>>> x.get_int_val()
50

>>> x.get_string_val()
''

рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рд╕реА ++ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдпрд╛ред рдЖрдЧреЗ рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рд╕реБрдВрджрд░рддрд╛ рд▓рд╛рдПрдВрдЧреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗред

рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ


рдПрд╕рдЖрдИрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╕реА ++ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдлреВ рдХрдХреНрд╖рд╛ рдореЗрдВ рджреЛ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рджреЛ рд╕реЗрдЯрд░ рд╣реИрдВ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рд╕ рдХреЛ рдЕрдзрд┐рдХ "рдкрд╛рдпрдерди" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрд╕рдЖрдИрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, pyfoo_cpp_02 рдлрд╝реЛрд▓реНрдбрд░ рд╢реЛ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг ред

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдореБрдЦреНрдп рдЕрдВрддрд░ pyfoocpp.sip рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ , рдЬреЛ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

%Module(name=foocpp, language="C++")
%DefaultEncoding "UTF-8"

class Foo {
    %TypeHeaderCode
    #include <foo.h>
    %End

    public:
        Foo(int, const char*);

        void set_int_val(int);
        int get_int_val();
        %Property(name=int_val, get=get_int_val, set=set_int_val)

        void set_string_val(const char*);
        char* get_string_val();
        %Property(name=string_val, get=get_string_val, set=set_string_val)
};

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдкреНрд░реЙрдкрд░реНрдЯреА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, % рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ , рдЬреЛ рджреЛ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ: рдирд╛рдо рдЧреБрдг рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдЯрд░реНрди рдПрдХ рдореВрд▓реНрдп (рдЧреЗрдЯрд░) рдПрдХ рд╡рд┐рдзрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдПрдХ рд╕реЗрдЯрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕реЗрдЯреНрдЯрд░ рд╡рд┐рдзрд┐ рдХреЛ рд╕реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЧреБрдгреЛрдВ рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдХреЗрд╡рд▓ рд╕рд┐рдк-рд╡реНрд╣реАрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрдХреЗрдЬ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдЬрдЧрд░ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХрдорд╛рдВрдб рдореЛрдб рдореЗрдВ рдЧреБрдгреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ:

>>> from foocpp import Foo
>>> x = Foo(10, "Hello")
>>> x.int_val
10

>>> x.string_val
'Hello'

>>> x.int_val = 50
>>> x.string_val = ''

>>> x.get_int_val()
50

>>> x.get_string_val()
''

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдлреВ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ , int_val рдФрд░ string_val рдЧреБрдг рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВ


рд╣рдо рдЕрдкрдиреЗ рдлреВ рд╡рд░реНрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд░рд╣реЗрдВрдЧреЗ ред рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг, рдЬреЛ pyfoo_cpp_03 рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ , рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд░реНрдЧ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрддреНрд╡реЛрдВ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрдиреЗрдВ (рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд┐рдЫрд▓реЗ рдПрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди pyfoocpp.sip рдлрд╝рд╛рдЗрд▓ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИ ред рдпрд╣рд╛рдБ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИрдВ:

%Module(name=foocpp, language="C++")
%DefaultEncoding "UTF-8"

class Foo {
%Docstring
Class example from C++ library
%End

    %TypeHeaderCode
    #include <foo.h>
    %End

    public:
        Foo(int, const char*);

        void set_int_val(int);
        %Docstring(format="deindented", signature="prepended")
            Set integer value
        %End

        int get_int_val();
        %Docstring(format="deindented", signature="prepended")
            Return integer value
        %End

        %Property(name=int_val, get=get_int_val, set=set_int_val)
        {
            %Docstring "deindented"
                The property for integer value
            %End
        };

        void set_string_val(const char*);
        %Docstring(format="deindented", signature="appended")
            Set string value
        %End

        char* get_string_val();
        %Docstring(format="deindented", signature="appended")
            Return string value
        %End

        %Property(name=string_val, get=get_string_val, set=set_string_val)
        {
            %Docstring "deindented"
                The property for string value
            %End
        };
};

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭрддреЗ рдереЗ, рд╡рд░реНрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ % Docstring рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП sip- рд╡реНрд╣реАрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pyfoocpp рдкреИрдХреЗрдЬ рдХреЛ рддреБрд░рдВрдд рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ , рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдФрд░ рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдкрд╛рдпрдерди рдореЛрдб рдореЛрдб рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдХрд┐рд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрдиреЗрдВ __doc__ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдпреЗ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред

рдкреНрд░рд▓реЗрдЦрди рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдлреВ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╣реИредред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд╛рдЗрдиреЗрдВ % Docstring рдФрд░ % End рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рдд рд╣реИрдВ ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рд▓рд╛рдЗрдиреЗрдВ 5-7 % Docstring рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ , рдЗрд╕рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрди рдлреВ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреА рдЬрд╛рдПрдЧреА ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд▓рд╛рдЗрдиреЛрдВ 5-7 рдореЗрдВ рдХреЛрдИ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рдордиреЗ рдЗрдВрдбреЗрдВрдЯ рднреА рдлреВред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ Foo рд╡рд░реНрдЧ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рд░реЗрдЦрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдерд╛:

>>> from foocpp import Foo
>>> Foo.__doc__
'Class example from C++ library'

рдирд┐рдореНрди % Docstring рдирд┐рд░реНрджреЗрд╢ , 17-19 рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рд░реВрдк рдкреИрд░рд╛рдореАрдЯрд░ рджреЛ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ: "рдХрдЪреНрдЪрд╛" рдпрд╛ "рдирд┐рд░реНрдмрд╛рдз"ред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд╛рди рд╡рд░реНрдг (рд▓реЗрдХрд┐рди рдЯреИрдм рдирд╣реАрдВ) рд╣рдЯрд╛рдП рдЧрдП рд╣реИрдВред рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдпрджрд┐ рдкреНрд░рд╛рд░реВрдк рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ % DefaultDocstringFormat рдирд┐рд░реНрджреЗрд╢ (рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдФрд░ рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░реВрдк = "рдХрдЪреНрдЪрд╛" рд╣реИ ред

рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрд╕рдЖрдИрдкреА рдЕрдкрдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЗрдирдкреБрдЯ рдкрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрддрд╛ рд╣реИ)ред рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╣рд╛рдВ рд░рдЦреЗ рдЬрд╛рдПрдВ: рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рд╛рдЗрди ( рд╣рд╕реНрддрд╛рдХреНрд╖рд░ = " рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд " ) рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕рдХреЗ рдмрд╛рдж ( рд╣рд╕реНрддрд╛рдХреНрд╖рд░ = "рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛" ) рдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ ( рд╣рд╕реНрддрд╛рдХреНрд╖рд░ = "рдЦрд╛рд░рд┐рдЬ" ) рди рдЬреЛрдбрд╝реЗрдВ ред

рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг get_int_val рдФрд░ set_int_val рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ = " рдкреВрд░реНрд╡ - рдирд┐рд░реНрдзрд╛рд░рд┐рдд " рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ , рд╕рд╛рде рд╣реА get_string_val рдФрд░ set_string_val рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ = "рд╕рдВрд▓рдЧреНрди"ред рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реВрдк = "рдбрд┐рдЗрдВрдбреЗрдВрдЯреЗрдб" рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

>>> Foo.get_int_val.__doc__
'get_int_val(self) -> int\nReturn integer value'

>>> Foo.set_int_val.__doc__
'set_int_val(self, int)\nSet integer value'

>>> Foo.get_string_val.__doc__
'Return string value\nget_string_val(self) -> str'

>>> Foo.set_string_val.__doc__
'Set string value\nset_string_val(self, str)'

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, % Docstring рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рдЖрдк рдкреНрд░рд▓реЗрдЦрди рд░реЗрдЦрд╛ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд┐рд╡рд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рдЧреБрдгреЛрдВ рдореЗрдВ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд░реЗрдЦрд╛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, % Docstring ... % рд╕рдорд╛рдкреНрддрд┐ рдирд┐рд░реНрджреЗрд╢% рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рдж рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИрдВред рдпрд╣ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк % рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо % Docstring рдирд┐рд░реНрджреЗрд╢рд╛рддреНрдордХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ ред рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдкреНрд░рд╛рд░реВрдк рд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рд╣рдо рдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд╛рд░реВрдк рдкреИрд░рд╛рдореАрдЯрд░



) рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрди рд╕реЗрдЯ рд╣реИ:

>>> Foo.int_val.__doc__
'The property for integer value'

>>> Foo.string_val.__doc__
'The property for string value'

>>> help(Foo)
Help on class Foo in module foocpp:

class Foo(sip.wrapper)
 |  Class example from C++ library
 |  
 |  Method resolution order:
 |      Foo
 |      sip.wrapper
 |      sip.simplewrapper
 |      builtins.object
 |  
 |  Methods defined here:
 |  
 |  get_int_val(...)
 |      get_int_val(self) -> int
 |      Return integer value
 |  
 |  get_string_val(...)
 |      Return string value
 |      get_string_val(self) -> str
 |  
 |  set_int_val(...)
 |      set_int_val(self, int)
 |      Set integer value
 |  
 |  set_string_val(...)
 |      Set string value
 |      set_string_val(self, str)
...


рдЖрдЗрдП % DefaultDocstringFormat рдФрд░ % DefaultDocstringSignature рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рд░реВрдк рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдХреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ ред рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ pyfoo_cpp_04 рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ pyfoocpp.sip рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рд╣реИ:

%Module(name=foocpp, language="C++")
%DefaultEncoding "UTF-8"
%DefaultDocstringFormat "deindented"
%DefaultDocstringSignature "prepended"

class Foo {
    %Docstring
    Class example from C++ library
    %End

    %TypeHeaderCode
    #include <foo.h>
    %End

    public:
        Foo(int, const char*);

        void set_int_val(int);
        %Docstring
            Set integer value
        %End

        int get_int_val();
        %Docstring
            Return integer value
        %End

        %Property(name=int_val, get=get_int_val, set=set_int_val)
        {
            %Docstring
                The property for integer value
            %End
        };

        void set_string_val(const char*);
        %Docstring
            Set string value
        %End

        char* get_string_val();
        %Docstring
            Return string value
        %End

        %Property(name=string_val, get=get_string_val, set=set_string_val)
        {
            %Docstring
                The property for string value
            %End
        };
};

рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд▓рд╛рдЗрдиреЗрдВ % DefaultDocstringFormat "deindented" рдФрд░ % DefaultDocstringSignature "prepended" рдЬреЛрдбрд╝реЗ рдЧрдП , рдФрд░ рдлрд┐рд░ % Docstring рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдЯрд╛ рджрд┐рдП рдЧрдПред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлреВ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЕрдм рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ , рдЬреЛ рдорджрдж (рдлреВ рдХрдорд╛рдВрдб рдХрдорд╛рдВрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ :

>>> from foocpp import Foo
>>> help(Foo)

class Foo(sip.wrapper)
 |  Class example from C++ library
 |  
 |  Method resolution order:
 |      Foo
 |      sip.wrapper
 |      sip.simplewrapper
 |      builtins.object
 |  
 |  Methods defined here:
 |  
 |  get_int_val(...)
 |      get_int_val(self) -> int
 |      Return integer value
 |  
 |  get_string_val(...)
 |      get_string_val(self) -> str
 |      Return string value
 |  
 |  set_int_val(...)
 |      set_int_val(self, int)
 |      Set integer value
 |  
 |  set_string_val(...)
 |      set_string_val(self, str)
 |      Set string value
...

рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд╛рдл-рд╕реБрдерд░рд╛ рдФрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд┐рдЦрддрд╛ рд╣реИред

рд╡рд░реНрдЧреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ, рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдирд╛ рд╣реИ рдЬреЛ C / C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдКрдкрд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЧреБрдг рдЬреЛрдбрд╝реЗ рд╣реИрдВ, рдФрд░ рдЕрдм рд╣рдо рдПрдХ рдФрд░ рддрдХрдиреАрдХ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЬреЛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдпрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЯрдХрд░рд╛рд╡ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреБрдЫ рдкрд╛рдпрдерди рдХреАрд╡рд░реНрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд░реНрдЧреЛрдВ, рдХрд╛рд░реНрдпреЛрдВ, рдЕрдкрд╡рд╛рджреЛрдВ рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЗрдХрд╛рдИ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, PyName рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬрд┐рд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдПрдХ рдирдпрд╛ рдирд┐рдХрд╛рдп рдирд╛рдо рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред PyName рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо pyfoo_cpp_05 рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИредpyfoo_cpp_04 рдФрд░ рдлрд╝рд╛рдЗрд▓ pyfoocpp.sip рджреНрд╡рд╛рд░рд╛ рдЗрд╕рд╕реЗ рдЕрд▓рдЧ рд╣реИ , рдЬрд┐рд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

%Module(name=foocpp, language="C++")
%DefaultEncoding "UTF-8"
%DefaultDocstringFormat "deindented"
%DefaultDocstringSignature "prepended"

class Foo /PyName=Bar/ {
    %Docstring
    Class example from C++ library
    %End

    %TypeHeaderCode
    #include <foo.h>
    %End

    public:
        Foo(int, const char*);

        void set_int_val(int) /PyName=set_integer_value/;
        %Docstring
            Set integer value
        %End

        int get_int_val() /PyName=get_integer_value/;
        %Docstring
            Return integer value
        %End

        %Property(name=int_val, get=get_integer_value, set=set_integer_value)
        {
            %Docstring
                The property for integer value
            %End
        };

        void set_string_val(const char*) /PyName=set_string_value/;
        %Docstring
            Set string value
        %End

        char* get_string_val() /PyName=get_string_value/;
        %Docstring
            Return string value
        %End

        %Property(name=string_val, get=get_string_value, set=set_string_value)
        {
            %Docstring
                The property for string value
            %End
        };
};

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдлреВ рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдмрд╛рд░ рдХреНрд▓рд╛рд╕ рдХрд░ рджрд┐рдпрд╛ , рдФрд░ рдЕрдиреНрдп рдирд╛рдореЛрдВ рдХреЛ рднреА PyName рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕реМрдВрдкрд╛ ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рд╡рд╣ рд╣реИ рдЧреБрдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред % рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ, рдкреНрд░рд╛рдкреНрдд рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╛рдпрдерди рд╡рд░реНрдЧ рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рди рдХрд┐ рдЙрди рдирд╛рдореЛрдВ рдХреЛ рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ C ++ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред

рдЙрджрд╛рд╣рд░рдг рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдпрд╣ рд╡рд░реНрдЧ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:

>>> from foocpp import Bar
>>> help(Bar)

Help on class Bar in module foocpp:

class Bar(sip.wrapper)
 |  Class example from C++ library
 |  
 |  Method resolution order:
 |      Bar
 |      sip.wrapper
 |      sip.simplewrapper
 |      builtins.object
 |  
 |  Methods defined here:
 |  
 |  get_integer_value(...)
 |      get_integer_value(self) -> int
 |      Return integer value
 |  
 |  get_string_value(...)
 |      get_string_value(self) -> str
 |      Return string value
 |  
 |  set_integer_value(...)
 |      set_integer_value(self, int)
 |      Set integer value
 |  
 |  set_string_value(...)
 |      set_string_value(self, str)
 |      Set string value
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
 |  
 |  int_val
 |      The property for integer value
 |  
 |  string_val
 |      The property for string value
 |  
 |  ----------------------------------------------------------------------
...

рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд░ рджрд┐рдпрд╛! рд╣рдо рд╡рд░реНрдЧ рдФрд░ рдЙрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред

рдХрднреА-рдХрднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдордЭреМрддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд╛рдо рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпреВрдЯреА рдореЗрдВ "рдХреНрдпреВ" рдпрд╛ wxWidgets рдореЗрдВ "wx" рдЕрдХреНрд╖рд░ рдХреЗ рд╕рд╛рдеред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рдпрдерди рдмрдВрдзрди рдореЗрдВ рдЖрдк рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕реЗ рдЙрдкрд╕рд░реНрдЧреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП PyName рдПрдиреЛрдЯреЗрд╢рди рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк % AutoPyName рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣реЗрдВрдЧреЗ рдХрд┐ % AutoPyName рдирд┐рд░реНрджреЗрд╢ % рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╕реЗ рдЦреБрдж рдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

%Module PyQt5.QtCore
{
    %AutoPyName(remove_leading="Q")
}

рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдЬреЛрдбрд╝реЗрдВ


рдЙрджрд╛рд╣рд░рдг std :: wstring рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП


рдЕрдм рддрдХ, рд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрдВрдЯ рдФрд░ рдЪрд╛рд░ * рдЬреИрд╕реЗ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ ред рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, SIP рдиреЗ рдкрд╛рдпрдерди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдФрд░ рдЙрд╕рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдмрдирд╛рдпрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЬреЛ pyfoo_cpp_06 рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ , рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬрдм рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИрдВ рдФрд░ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд╕рдЯреАрдПрд▓ рд╕реЗ рддрд╛рд░ред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдпреВрдирд┐рдХреЛрдб рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд░реЗрдВ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ std :: wstring string class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╛рдпрдерди рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ C ++ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ рдлреВ рд╡рд░реНрдЧ рд╕реЗ foo рдкреБрд╕реНрддрдХрд╛рд▓рдпред рдЕрдм рдХрдХреНрд╖рд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА (рдлрд╝рд╛рдЗрд▓ foo.h ):

#ifndef FOO_LIB
#define FOO_LIB

#include <string>

using std::wstring;

class Foo {
    private:
        int _int_val;
        wstring _string_val;
    public:
        Foo(int int_val, wstring string_val);

        void set_int_val(int val);
        int get_int_val();

        void set_string_val(wstring val);
        wstring get_string_val();
};

#endif

Foo.cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ Foo рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди :

#include <string>

#include "foo.h"

using std::wstring;

Foo::Foo(int int_val, wstring string_val):
    _int_val(int_val), _string_val(string_val) {}

void Foo::set_int_val(int val) {
    _int_val = val;
}

int Foo::get_int_val() {
    return _int_val;
}

void Foo::set_string_val(wstring val) {
    _string_val = val;
}

wstring Foo::get_string_val() {
    return _string_val;
}

рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП main.cpp рдлрд╝рд╛рдЗрд▓ :

#include <iostream>

#include "foo.h"

using std::cout;
using std::endl;

int main(int argc, char* argv[]) {
    auto foo = Foo(10, L"Hello");
    cout << L"int_val: " << foo.get_int_val() << endl;
    cout << L"string_val: " << foo.get_string_val().c_str() << endl;

    foo.set_int_val(0);
    foo.set_string_val(L"Hello world!");

    cout << L"int_val: " << foo.get_int_val() << endl;
    cout << L"string_val: " << foo.get_string_val().c_str() << endl;
}

рдлрд╝рд╛рдЗрд▓реЗрдВ foo.h , foo.cpp рдФрд░ main.cpp , рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ, рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ foo рдлрд╝реЛрд▓реНрдбрд░ ред рдореЗрдХрдлрд╛рдЗрд▓ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдмрджрд▓реА рд╣реИред Pyproject.toml рдФрд░ project.py рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИрдВ ред

рд▓реЗрдХрд┐рди pyfoocpp.sip рдлрд╝рд╛рдЗрд▓ рдХрд╛рдлрд╝реА рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдИ рд╣реИ:

%Module(name=foocpp, language="C++")
%DefaultEncoding "UTF-8"

class Foo {
    %TypeHeaderCode
    #include <foo.h>
    %End

    public:
        Foo(int, std::wstring);

        void set_int_val(int);
        int get_int_val();
        %Property(name=int_val, get=get_int_val, set=set_int_val)

        void set_string_val(std::wstring);
        std::wstring get_string_val();
        %Property(name=string_val, get=get_string_val, set=set_string_val)
};

%MappedType std::wstring
{
%TypeHeaderCode
#include <string>
%End

%ConvertFromTypeCode
    // Convert an std::wstring to a Python (Unicode) string
    PyObject* newstring;
    newstring = PyUnicode_FromWideChar(sipCpp->data(), -1);
    return newstring;
%End

%ConvertToTypeCode
    // Convert a Python (Unicode) string to an std::wstring
    if (sipIsErr == NULL) {
        return PyUnicode_Check(sipPy);
    }
    if (PyUnicode_Check(sipPy)) {
        *sipCppPtr = new std::wstring(PyUnicode_AS_UNICODE(sipPy));
        return 1;
    }
    return 0;
%End
};

рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, pyfoocpp.sip рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд▓рд╛рдЗрдиреЗрдВ рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ % MappedType рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд┐рдирд╛ pyfoocpp.sip рдлрд╝рд╛рдЗрд▓ рдореЗрдВ Foo рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ , рддреЛ рд╣рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:

$ sip-wheel

These bindings will be built: pyfoocpp.
Generating the pyfoocpp bindings...
sip-wheel: std::wstring is undefined

рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ std :: wstring рдХреЛ рдХреБрдЫ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╡реНрдпреБрддреНрдХреНрд░рдо рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ C рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рдлреА рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ Python / C API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдЪреВрдВрдХрд┐ рдкрд╛рдпрдерди / рд╕реА рдПрдкреАрдЖрдИ рдПрдХ рдмрдбрд╝рд╛ рд╡рд┐рд╖рдп рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреБрд╕реНрддрдХ, рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ред

C ++ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рдкрд╛рдпрдерди рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MappedType рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ , рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рддреАрди рдЕрдиреНрдп рдирд┐рд░реНрджреЗрд╢ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: % TypeHeaderCode , % ConvertToTypeCode рдФрд░ % ConvertFromTypeCodeред % MappedType рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ % MappedType std :: wstring рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ ред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА % TypeHeaderCode рдХреЗ

рдирд┐рд░реНрджреЗрд╢ рдХреЛ C ++ рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдмрдирд╛рддреЗ рд╣реБрдП рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдорд┐рд▓ рдЪреБрдХреЗ рд╣реИрдВ ред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдпрд╛ рдЙрди рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рдирдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ , рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ , рдЬрд╣рд╛рдБ рд╡рд░реНрдЧ std :: string рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, % TypeHeaderCode рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдВрджрд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ ред рдЕрдм рд╣рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ



% ConvertFromTypeCodeред C ++ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкрд╛рдпрдерди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛


рд╣рдо std :: wstring рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкрд╛рдпрдерди рд╡рд░реНрдЧ str рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

%ConvertFromTypeCode
    // Convert an std::wstring to a Python (Unicode) string
    PyObject* newstring;
    newstring = PyUnicode_FromWideChar(sipCpp->data(), -1);
    return newstring;
%End

рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдВрджрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ sipCpp рд╡реИрд░рд┐рдПрдмрд▓ рд╣реИ - C ++ рдХреЛрдб рд╕реЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдореЗрдВ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, sipCpp рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИ std :: wstring * ред рд╕реНрдЯреНрд░реЙрдЧ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП , Python / C API рд╕реЗ PyUnicode_FromWideChar рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ w const_t * w рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд░рдгреА (рдкреЙрдЗрдВрдЯрд░) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ , рдФрд░ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ред рдпрджрд┐ рдЖрдк рдорд╛рди -1 рдХреЛ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ PyUnicode_FromWideChar рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛Wcslen ред Wchar_t *

рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, std :: wstring рд╡рд░реНрдЧ рд╕реЗ рдбреЗрдЯрд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред PyUnicode_FromWideChar рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рд░рд┐рдЯрд░реНрди PyObject рдпрд╛ рд╢реВрдиреНрдп рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред PyObject рдХрд┐рд╕реА рднреА рдЕрдЬрдЧрд░ рд╡рд╕реНрддреБ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╣реЛ рдЬрд╛рдПрдЧрд╛ str рд╡рд░реНрдЧ ред Python / C API рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ PyObject * рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо PyObject * рдкреЙрдЗрдВрдЯрд░ рдХреЛ % ConvertFromTypeCode рдХреЗ рдирд┐рд░реНрджреЗрд╢ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ ред



% ConvertToTypeCodeред рдЕрдЬрдЧрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ C ++ рдореЗрдВ рдмрджрд▓реЗрдВ


рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рд░реВрдкрд╛рдВрддрд░рдг (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ PyObject * рд╕реЗ ) std :: wstring рд╡рд░реНрдЧ рдХреЛ % ConvertToTypeCode рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред Pyfoo_cpp_06 рдЙрджрд╛рд╣рд░рдг рдореЗрдВ , рд░реВрдкрд╛рдВрддрд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

%ConvertToTypeCode
    // Convert a Python (Unicode) string to an std::wstring
    if (sipIsErr == NULL) {
        return PyUnicode_Check(sipPy);
    }
    if (PyUnicode_Check(sipPy)) {
        *sipCppPtr = new std::wstring(PyUnicode_AS_UNICODE(sipPy));
        return 1;
    }
    return 0;
%End

% ConvertToTypeCode рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдХреЛрдб рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рджрд┐рдЦрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред % ConvertToTypeCode рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдВрджрд░, SIP рдХрдИ рдЪрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдЪрд░, PyObject * sipPy, рдПрдХ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ std :: wstring рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреВрд╕рд░реЗ рдЪрд░ рдкрд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ - sipCppPtr рдирд┐рд░реНрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рджреЛрд╣рд░рд╛ рд╕реВрдЪрдХ рд╣реИ, рдЕрд░реНрдерд╛рддред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡реИрд░рд┐рдПрдмрд▓ std :: wstring ** рдХрд╛ рд╣реЛрдЧрд╛ ред

рдПрдХ рдФрд░ % ConvertToTypeCode рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛рдЪрд░ int * sipIsErr рд╣реИ ред рдпрджрд┐ рдЗрд╕ рдЪрд░ рдХрд╛ рдорд╛рди NULL рд╣реИ , рддреЛ % ConvertToTypeCode рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрднрд╡ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛ред 0. рдпрджрд┐ рдпрд╣ рд╕реВрдЪрдХ NULL рдирд╣реАрдВ рд╣реИ , рддреЛ рдЖрдкрдХреЛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЛрдб рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдЪрд░ рдореЗрдВ (рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдЪрд░ int * рдХрд╛ рд╕реВрдЪрдХ рд╣реИ )ред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рд┐рдкреНрдкреА рдПрдХ рдпреВрдирд┐рдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╣реИ str рд╡рд░реНрдЧ ), PyUnicode_Check рдореИрдХреНрд░реЛ рд╣реИ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рддрд░реНрдХ рд▓реЗрддрд╛ PyObject * рдЕрдЧрд░ рдкрд╛рд░рд┐рдд рддрд░реНрдХ рдПрдХ рдпреВрдирд┐рдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рдПрдХ рд╡рд░реНрдЧ рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реИред

C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ * sipCppPtr = new std :: wstring (PyUnicode_AS_UNICODE (sipPy)) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ; ред рдпрд╣ PyUnicode_AS_UNICODE рдореИрдХреНрд░реЛ рдХреЛ Python / C API рд╕реЗ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ Py_UNICODE * рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ , рдЬреЛ wchar_t * рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ ред рдЗрд╕ рд╕рд░рдгреА рдХреЛ std :: wstring рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо sipCppPtr рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ ред

рдлрд┐рд▓рд╣рд╛рд▓, PyUnicode_AS_UNICODE рдирд┐рд░реНрджреЗрд╢ рдкрджрд╛рд╡рдирдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдиреНрдп рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдлрд▓ рд░рд╣рд╛, рддреЛ % ConvertToTypeCode рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдПрдХ рд╢реВрдиреНрдп-рд╢реВрдиреНрдп рдорд╛рди (рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ 1) рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ 0 рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЪреЗрдХ


рд╣рдордиреЗ рдЯрд╛рдЗрдк std рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ : wstring to str рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдм рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреИрдХреЗрдЬ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЬреИрд╕реА рдЙрд╕реЗ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рдк-рд╡реНрд╣реАрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ , рдлрд┐рд░ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрд╛рдпрдерди рдХрдорд╛рдВрдб рдореЛрдб рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

>>> from foocpp import Foo
>>> x = Foo(10, 'Hello')

>>> x.string_val
'Hello'

>>> x.string_val = ''
>>> x.string_val
''

>>> x.get_string_val()
''

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдпреВрдирд┐рдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реВрдкрд╛рдВрддрд░рдг рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдП рдЧрдПред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ C рдФрд░ C ++ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП SIP рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ред рдкрд╣рд▓реЗ ( рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ ) рд╣рдордиреЗ рд╕реА рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ рдФрд░ рдПрд╕рдЖрдИрдкреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред Pyproject.toml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреИрдХреЗрдЬ (рдирд╛рдо, рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛, рд▓рд╛рдЗрд╕реЗрдВрд╕ рдФрд░ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрде) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред Project.py рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C / C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░реЗрдВ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╣реЗрдбрд░ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред * .Sip

рдлрд╝рд╛рдЗрд▓ рдореЗрдВрдЙрди рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реЛрдВрдЧреЗред * .Sip рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдкрд╛рдпрдерди рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ C ++ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк % рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЧреБрдг рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ , / PyName / рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ , рдФрд░ % Docstring рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд▓реЗрдЦрди рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ ред

рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реЗ int , char , char *рдЖрджрд┐ред рдПрд╕рдЖрдИрдкреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдкрд╛рдпрдерди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╛рдпрдерди / рд╕реА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ % MappedType рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдВрджрд░ рдЦреБрдж рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдкрд╛рдпрдерди рд╡рд░реНрдЧ рд╕реЗ C ++ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг % ConvertToTypeCode рдиреЗрд╕реНрдЯреЗрдб рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред C ++ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд╛рдпрдерди рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ % ConvertFromTypeCode рдиреЗрд╕реНрдЯреЗрдб рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред % DefaultEncoding , % DefaultDocstringFormat рдФрд░ % DefaultDocstringSignature

рдЬреИрд╕реЗ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢ рд╕рд╣рд╛рдпрдХ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЛ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдореВрд▓ рдФрд░ рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрдЖрдИрдПрд▓ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдирдП рдкрд╛рдЗрдерди рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдХрд┐рдВрдЧ рдЯреНрд╡рд┐рдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдФрд░ рдХрдИ рдЕрдиреНрдп рдЬреЛ рдЬрдЯрд┐рд▓ рд╕реА / рд╕реА ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдореБрджреНрджреЗ рдХреЛ рднреА рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдЦреБрдж рдХреЛ gcc / g ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ред

рд╕рдВрджрд░реНрдн



All Articles