Boost.Python рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдЯрд╛рдЗрдк рдХрд░реЗрдВред рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ C ++ рдФрд░ рдкрд╛рдпрдерди рдХреЗ рдмреАрдЪ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддреЗ рд╣реИрдВ

рдпрд╣ рд▓реЗрдЦ C ++ API рдЖрд╡рд░рдг рдХрд╣рд╛рдиреА рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдЬ рдХреЛрдИ рд░реИрдкрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдпрд╣ рдЗрд╕ рдХрд╣рд╛рдиреА рдХрд╛ рддреАрд╕рд░рд╛ рднрд╛рдЧ рд╣реИред
рдЖрдЬ рд░рдХреНрдд рдХрд╛ рдПрдХ рд╕рдореБрджреНрд░ рд╣реЛрдЧрд╛, рдореМрдЬреВрджрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рдШрдЯрди рдФрд░ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рдПрдирд╛рд▓реЙрдЧреНрд╕ рдореЗрдВ рдЙрдирдХреЗ рдЬрд╛рджреБрдИ рдкрд░рд┐рд╡рд░реНрддрдиред
рд╣рдо рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рдореМрдЬреВрджрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдирд╣реАрдВ, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рд▓рд┐рдЦреЗрдВрдЧреЗред
рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рдпрдерди рдбреЗрдЯрд╛рдЗрдо рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗ :: рдкреЙрдЬрд╝рд┐рдХреНрд╕_рдЯрд╛рдЗрдо :: рдмреВрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕рдордп рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕рдХреЗ рд╕рд╛рде рдирд░рдХ рдореЗрдВ, рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдкреВрд░реЗ рдбреЗрдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ! рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдмрд╛рдК рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд╛рдпрдерди 3.x рдмрд╛рдЗрдЯ рд╕рд░рдгреА рд╡рд░реНрдЧ рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ Boost.Python рдореЗрдВ рдХреЛрдИ рдХрдирд╡рд░реНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рдирдП рдкрд╛рдпрдерди рдХрдирд╡рд░реНрдЯрд░ uuid.UUID рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯ рд╕рд░рдгреА рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ :: uuids: : рдЙреВрдпрдб ред рд╣рд╛рдБ, рдХрдирд╡рд░реНрдЯрд░ рдореЗрдВ рдХрдирд╡рд░реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!
рдЦреВрди рдХреЗ рд▓рд┐рдП рддрд░рд╕, рдХрд╛рд▓реАрдЬрд╝реАрдпрдо?!

рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛



рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп


рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдЧреМрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ Boost.Python рдПрдХ рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╛рдпрдерди рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╕реНрдХреЗрд▓рд░реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдореЛрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╢реБрджреНрдз рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рд╕реАрдзреЗ рд╕реА-рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЗрд╕реЗ рдЕрдкрдиреЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рджреЗрдВред рдЖрдзреБрдирд┐рдХ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдЖрд░рд╛рдо, рдПрдХ рдЖрд╕рд╛рди рдХреБрд░реНрд╕реА рдХреА рд╕реБрд╡рд┐рдзрд╛, рдЧрд░реНрдо рд╕реНрдирд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдФрд░ рдЯреАрд╡реА рдХреЗ рд▓рд┐рдП рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░реЗрдВред рд▓рдХрдбрд╝реА рдХреЗ рдмреЗрдВрдЪ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ, рдЫреЗрдж рдФрд░ рдЫреАрдВрдЯреЗ рдореЗрдВ рдзреЛрдиреЗ, рдЙрдиреНрд╣реЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд▓рд╛ рдореЗрдВ рд▓рдЧреЗ рд░рд╣рдиреЗ рджреЗрдВред
рддреЛ, рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЪреАрдЬ рд╣реИ: Boost.Python рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ - Python рд╕реЗ C ++ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕, рдЬреЛ рдХрд┐ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ $ (BoostPath) \ libs \ _ython \ src \ рдХрдирд╡рд░реНрдЯрд░ рдФрд░ $ (BoostPath) \ рдмреВрд╕реНрдЯ \ _ рдореЗрдВ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддреЗ рд╣реИрдВред рдЕрдЬрдЧрд░ \ _ рдХрдирд╡рд░реНрдЯрд░ред рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рд╣реИрдВ, рд╡реЗ рд▓рдЧрднрдЧ 95% рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╛рдпрдерди рдФрд░ рд╕реА ++ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ , рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕реА ++ рдореЗрдВ рд╣рдо рдпреВрдЯреАрдПрдл -8 рддрд╛рд░ рдпрд╛ рдЪреМрдбрд╝реА-рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рддреЗрдЬ рд╣реЛрдЧрд╛ред рдЧреБрдгрд╛рддреНрдордХ рдФрд░ рдЕрднреЗрджреНрдп рд░реВрдк рд╕реЗ, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреЗ рдЕрд░реНрде рдореЗрдВред
рд▓рдЧрднрдЧ рд╕рднреА рдЪреАрдЬреЗрдВ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЖрдкрдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд░реИрдкрд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХреА рдЬрд╛рддреА рд╣реИрдВред Boost.Python рдПрдХ рдореЗрдЯрд╛-рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд▓рд╛рд╕ рд░реИрдкрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд╛рдХреНрд╖рд╕реА рд░реВрдк рд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдкрд╛рдпрдерди рдХреНрд▓рд╛рд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
class_<Some>( "Some" ) .def( "method_A", &Some::method_A, args( "x", "y", "z" ) ) .def( "method_B", &Some::method_B, agrs( "u", "v" ) ) ; 

рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рдд рд╣реИ ...
... рдПрдХ рдмрдбрд╝рд╛ рдФрд░ рдЕрджреНрднреБрдд рдПрдХ: рд╕реА ++ рдФрд░ рдкрд╛рдпрдерди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВред рд╕реА ++ рдореЗрдВ
 #include <boost/date_time.hpp> #include <boost/uuid/uuid.hpp> 

рдкрд╛рдпрдерди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрдереНрдп рд╣реИ:
 import datetime import uuid 

рддреЛ, рдЖрдкрдХреЗ C ++ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдВрдзреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдврд╝рд╛рд╡рд╛ :: gregorian :: date class, рдФрд░ Python рдореЗрдВ, рдмрджрд▓реЗ рдореЗрдВ, рдмрд╣реБрдд рдХреБрдЫ datetime.date рд╡рд░реНрдЧ, рдЗрд╕рдХреЗ рдПрдирд╛рд▓реЙрдЧ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИред рдкрд╛рдЗрдерди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рдЖрд╡рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП :: gregorian :: рджрд┐рдирд╛рдВрдХ рд╡рд░реНрдЧ рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдкрдЯреЗ рд╣реБрдП, рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЫрдбрд╝реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдмреИрд╕рд╛рдЦреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдЧреНрд░реЗрдиреЗрдб рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рдХрд░ рд░рд╣рд╛ рд╣реИред рдФрд░ рдпрд╣ рдЧреНрд░реЗрдиреЗрдб рд╡рд┐рд╕реНрдлреЛрдЯ рдХрд░реЗрдЧрд╛, рдЬреВрд░реА рдХреЗ рд╕рдЬреНрдЬрдиреЛрдВред рдЕрдЬрдЧрд░ рдкрдХреНрд╖ рдкрд░, рдЖрдкрдХреЛ рддрд┐рдерд┐ рдФрд░ рд╕рдордп рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЕрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдкрдХреЛ C ++ рдореЗрдВ рдкрд╛рдпрдерди рдбреЗрдЯрдЯрд╛рдЗрдо рдХреЗ рдХреНрд╖реЗрддреНрд░ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдореБрд╕реНрдХреБрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ C ++ рдореЗрдВ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдореЗрдЧрд╛-рдХреНрд▓рд╛рд╕ рддрд┐рдерд┐ / рд╕рдордп рд╣реИ, рддреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдирд╡рд░реНрдЯрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдХреА рд╕рд╛рдЗрдХрд┐рд▓ рдкрджреНрдзрддрд┐ рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрдирд╣реБрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдкрд╛рдпрдерди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░, рдФрд░ рд╕реА ++ рдкрдХреНрд╖ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдкреНрд░рдХрд╛рд░ рдЬреЛ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдореВрд▓ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдХреНрдпрд╛ рд╣реИ


рдПрдХ рдХрдиреНрд╡рд░реНрдЯрд░ Boost.Python рд╕реЗ C ++ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрд╛рдпрдерди рдЯрд╛рдЗрдк рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд░реВрдкрд╛рдВрддрд░рдг рд╣реИред C ++ рдХреА рддрд░рдл, рдЖрдк рдкрд░рд┐рдЪрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдкреВрд░реНрдг рд╡рд┐рд╢реНрд╡рд╛рд╕ рдореЗрдВ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдпрд╣ рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛ред рдЕрд╕рд▓ рдореЗрдВ, рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдЖрдорддреМрд░ рдкрд░ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди C ++ рд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ, рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВрдЧреЗред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЕрдХреНрд╕рд░ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИред рдкрд╛рдЗрдерди рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИ, рддреЛ рдЖрдЗрдП C ++ рд╕реЗ рдкрд╛рдЗрдерди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред

C ++ рд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдЯрд╛рдЗрдк рдХрд░реЗрдВ


C ++ рд╕реЗ Python рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд░реВрдкрд╛рдВрддрд░рдг рд╡рд┐рдзрд┐ рд╣реЛ, рдЬреЛ C ++ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ PyObject * рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, Python C-API рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП :: python :: рд╡рд╕реНрддреБред
рдЖрдЗрдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдЕрднреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рд╕рд╛рдореВрд╣рд┐рдХ рд╡рдз рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
 template< typename T > struct type_into_python { static PyObject* convert( T const& ); }; 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░: posix_time :: ptime, рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╡рд┐рдзрд┐: рд╕рднреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
 template<> PyObject* type_into_python<ptime>::convert( ptime const& ); 

рдФрд░ BOOST_PYTHON_MODULE рдХреЗ рдЕрдВрджрд░ рдореЙрдбреНрдпреВрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп рдХрдирд╡рд░реНрдЯрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ:
  to_python_converter< ptime, type_into_python<ptime> >(); 

рдЦреИрд░, рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рдЕрдЬрд╝ рдХрд╣рд╛, рдЖрдЗрдП рдЖрдкрдХреЛ рдФрд░ рдмреБрдХреА рдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВред рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдирд╡рд░реНрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди :: posix_time :: ptime рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 PyObject* type_into_python<ptime>::convert( ptime const& t ) { auto d = t.date(); auto tod = t.time_of_day(); auto usec = tod.total_microseconds() % 1000000; return PyDateTime_FromDateAndTime( d.year(), d.month(), d.day(), tod.hours(), tod.minutes(), tod.seconds(), usec ); } 

рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдореЙрдбреНрдпреВрд▓ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реА-рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛рдЗрдо рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  PyDateTime_IMPORT; to_python_converter< ptime, type_into_python<ptime> >(); 

рд╕реНрдЯреНрд░рд┐рдВрдЧ PyDateTime_IMPORT рдХреЗ рдмрд┐рдирд╛ , рдХреБрдЫ рднреА рдмрдВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдереЗ рдХрд┐ рдкрд╛рдпрдерди рд╕реА-рдПрдкреАрдЖрдИ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирдП рдбреЗрдЯрд╛рдЯрд╛рдЗрдо.рдЯрд╛рдЗрдордЯрд╛рдЗрдо рдкрд░ PyObject * рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд╛рд░реНрдп рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднрд╛рдЧреНрдп рдХреЗ, рдмреВрд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдРрд╕реА "рдордЬрд╝реЗрджрд╛рд░" рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рдкреАрдЯрд╛рдЗрдо рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рд╣реИред рдХрдХреНрд╖рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реБрдИ, рдЖрдкрдХреЛ рдЙрд╕рдореЗрдВ рд╕реЗ рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рд╡рд╣рд╛рдВ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдХ рд╣реИрдВ, рдФрд░ рд╕рдордп time_duration рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдЗрддрдирд╛ рдбреЗрдЯрд╛рдЗрдо.рдЯрд╛рдЗрдо рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдбреЗрдЯрд╛рдЗрдо рдЯрд╛рдЗрдорд╕реНрдЯреЗрдореЗрд▓реНрдЯрд╛ ! рдпрд╣, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, C ++ рдореЗрдВ рдбреЗрдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдЕрдкреНрд░рд┐рдп рд╣реИ рдЬреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ :: posix_time :: time_duration рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдФрд░ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдпрд╛ рддреЛ "cunningly" рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП fractional_seconds () рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдбрд░рд╛рд╡рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рдореЙрдбреНрдпреВрд▓ Total_microseconds ()% 1000000 рд▓реЗ рд▓реЛред рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ - рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреИрд╕реЗ time_duration рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреЗрдЯрдЯрд╛рдЗрдо.рдЯрд╛рдЗрдо рдХреНрд▓рд╛рд╕ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджреЗрдВрдЧреЗ, рдФрд░ рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЕрдиреНрдп рдбреЗрдЯрд╛рдЗрдордЯрд╛рдЗрдордбрд┐рдореЗрд▓реЗрдЯрд╛ рдХреНрд▓рд╛рд╕ рдХреЛ рдирд╣реАрдВ рдЫреВрдПрдВрдЧреЗред

рдЕрдЬрдЧрд░ рд╕реЗ C ++ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ


рд╣реЗ, рдореЗрд░реЗ рджреЛрд╕реНрддреЛрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХрдард┐рди рдмрд┐рдВрджреБ рд╣реИред рд╕реНрдЯреЙрдХ рд╡реИрд▓рд┐рдбреЛрд▓, рдЕрдкрдиреА рд╕реАрдЯ рдмреЗрд▓реНрдЯ рдЬрдХрдбрд╝реЗрдВред
рд╕рдм рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ: рд╣рдо рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдФрд░ рдирд┐рд░реНрдорд╛рдг - рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ C ++ рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЯрд╛рдЗрдк рдХрд░рддреА рд╣реИрдВред рджрд░рдЕрд╕рд▓, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рддрд░реАрдХреЛрдВ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рд╣рдорд╛рд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:
 template< typename T > struct type_from_python { type_from_python() { converter::registry::push_back( convertible, construct, type_id<T>() ); } static void* convertible( PyObject* ); static void construct( PyObject*, converter::rvalue_from_python_stage1_data* ); }; 

рджрд░рдЕрд╕рд▓, рдореЙрдбреНрдпреВрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдареАрдХ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдордп рдХреЗ рд▓рд┐рдП:
 template<> void* type_from_python<ptime>::convertible( PyObject* ); template<> void type_from_python<ptime>::construct( PyObject*, converter::rvalue_from_python_stage1_data* ); 

рдЖрдЗрдП, рдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдкрд░реАрдХреНрд╖рдг рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ рддреБрд░рдВрдд рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐:
 void* type_from_python<ptime>::convertible( PyObject* obj ) { return PyDateTime_Check( obj ) ? obj : nullptr; } void type_from_python<ptime>::construct( PyObject* obj, converter::rvalue_from_python_stage1_data* data ) { auto storage = reinterpret_cast< converter::rvalue_from_python_storage<ptime>* >( data )->storage.bytes; date date_only( PyDateTime_GET_YEAR( obj ), PyDateTime_GET_MONTH( obj ), PyDateTime_GET_DAY( obj ) ); time_duration time_of_day( PyDateTime_DATE_GET_HOUR( obj ), PyDateTime_DATE_GET_MINUTE( obj ), PyDateTime_DATE_GET_SECOND( obj ) ); time_of_day += microsec( PyDateTime_DATE_GET_MICROSECOND( obj ) ); new(storage) ptime( date_only, time_of_day ); data->convertible = storage; } 

рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдЖрдк рдбреЗрдЯрд╛рдЗрдо - рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдУ , рдирд╣реАрдВ - рдЕрд╢рдХреНрдд рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВред
рд▓реЗрдХрд┐рди рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдмрд┐рд▓реНрдХреБрд▓ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдЧреНрд░ рд╣реЛ рдЬрд╛рдПрдЧреА!
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ MyDateTime рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╣реЛрд╕реНрдЯ рдирдП рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ , рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреА! рдЗрд╕ рдордЬрд╝реЗрджрд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ:
  new(storage) ptime( date_only, time_of_day ); 

рдпрд╣ рдореЗрдЬрдмрд╛рди рдирдпрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдирдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдерд╛рди рдкрд░ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рд╕реНрдерд╛рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЕрднреА рднреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕реВрдЪрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЬрд╛рддреА рд╣реИ:
  auto storage = reinterpret_cast< converter::rvalue_from_python_storage<ptime>* >( data )->storage.bytes; 

рдореИрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдЬрд░рд╛ рдпрд╛рдж рдХрд░реЛред
рдЧреИрд░-рд╕реНрд╡-рдирд┐рд╣рд┐рдд рдкреАрдЯрд╛рдЗрдо рд╡рд░реНрдЧ рдХреЗ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдгрдирд╛ рд╣реИред
рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдВрдд рдореЗрдВ рднрд░рдирд╛ рди рднреВрд▓реЗрдВ:
  data->convertible = storage; 

рдлрд┐рд░ рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ рдирд░рдо рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рдП, рдмрд╕ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рдлрд╝реАрд▓реНрдб рдХреЛ рднрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЦреБрд╢реА рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдЕрдкреНрд░рд┐рдп рдЫреЛрдЯреА рдЪреАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВред
рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ , FAQ рдЦрдВрдб рдореЗрдВ Boost.Python рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдпрд╣рд╛рдБ рдФрд░ рдпрд╣рд╛рдБ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдбреЗрдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ <рдмрдврд╝рд╛рд╡рд╛ / date_time.hpp> рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛


рдХреБрд▓, рддрд┐рдерд┐ рдФрд░ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╣рдорд╛рд░реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп_ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
 template<> PyObject* type_into_python<date>::convert( date const& ); template<> void* type_from_python<date>::convertible( PyObject* ); template<> void type_from_python<date>::construct( PyObject*, converter::rvalue_from_python_stage1_data* ); template<> PyObject* type_into_python<time_duration>::convert( time_duration const& ); template<> void* type_from_python<time_duration>::convertible( PyObject* ); template<> void type_from_python<time_duration>::construct( PyObject*, converter::rvalue_from_python_stage1_data* ); 

рдХрд╛рд░реНрдп рд╕рд░рд▓ рд╣реИ, рдпрд╣ рдкрд┐рдЫрд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реЗ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдмрд▓рддрд╛ рд╣реИред
рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП :: gregorian :: рджрд┐рдирд╛рдВрдХ рдФрд░ datetime.date :
 PyObject* type_into_python<date>::convert( date const& d ) { return PyDate_FromDate( d.year(), d.month(), d.day() ); } void* type_from_python<date>::convertible( PyObject* obj ) { return PyDate_Check( obj ) ? obj : nullptr; } void type_from_python<date>::construct( PyObject* obj, converter::rvalue_from_python_stage1_data* data ) { auto storage = reinterpret_cast< converter::rvalue_from_python_storage<date>* >( data )->storage.bytes; new(storage) date( PyDateTime_GET_YEAR( obj ), PyDateTime_GET_MONTH( obj ), PyDateTime_GET_DAY( obj ) ); data->convertible = storage; } 

рдФрд░ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП :: posix_time :: time_duration рдФрд░ datetime.time :
 PyObject* type_into_python<time_duration>::convert( time_duration const& t ) { auto usec = t.total_microseconds() % 1000000; return PyTime_FromTime( t.hours(), t.minutes(), t.seconds(), usec ); } void* type_from_python<time_duration>::convertible( PyObject* obj ) { return PyTime_Check( obj ) ? obj : nullptr; } void type_from_python<time_duration>::construct( PyObject* obj, converter::rvalue_from_python_stage1_data* data ) { auto storage = reinterpret_cast< converter::rvalue_from_python_storage<time_duration>* >( data )->storage.bytes; time_duration* t = new(storage) time_duration( PyDateTime_TIME_GET_HOUR( obj ), PyDateTime_TIME_GET_MINUTE( obj ), PyDateTime_TIME_GET_SECOND( obj ) ); *t += microsec( PyDateTime_TIME_GET_MICROSECOND( obj ) ); data->convertible = storage; } 

рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдпрд╣ рд╕рдм рд╕рд╛рдорд╛рди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
 BOOST_PYTHON_MODULE( ... ) { ... PyDateTime_IMPORT; to_python_converter< ptime, type_into_python<ptime> >(); type_from_python< ptime >(); to_python_converter< date, type_into_python<date> >(); type_from_python< date >(); to_python_converter< time_duration, type_into_python<time_duration> >(); type_from_python< time_duration >(); ... } 


рд╣рдо рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ


рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рд╣рдорд╛рд░реЗ рдореЗрдЧрд╛-рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рд╣рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдорд┐рд▓реЗрдВрдЧреЗ рдЬреЛ рдЗрдирдкреБрдЯ рдкрд░ рдПрдХ рддрд╛рд░реАрдЦ / рд╕рдордп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рджрд┐рдирд╛рдВрдХ / рд╕рдордп рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
 ptime tomorrow(); ptime day_before( ptime const& the_moment ); date last_day_of_this_month(); date year_after( date const& the_day ); time_duration delta_between( ptime const& at, ptime const& to ); time_duration plus_midday( time_duration const& the_moment ); 

рдЕрдЬрдЧрд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
  def( "tomorrow", tomorrow ); def( "day_before", day_before, args( "moment" ) ); def( "last_day_of_this_month", last_day_of_this_month ); def( "year_after", year_after, args( "day" ) ); def( "delta_between", delta_between, args( "at", "to" ) ); def( "plus_midday", plus_midday, args( "moment" ) ); 

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ):
 ptime tomorrow() { return microsec_clock::local_time() + days( 1 ); } ptime day_before( ptime const& that ) { return that - days( 1 ); } date last_day_of_this_month() { date today = day_clock::local_day(); date next_first_day = (today.month() == Dec) ? date( today.year() + 1, 1, 1 ) : date( today.year(), today.month() + 1, 1 ); return next_first_day - days( 1 ); } date year_after( date const& the_day ) { return the_day + years( 1 ); } time_duration delta_between( ptime const& at, ptime const& to ) { return to - at; } time_duration plus_midday( time_duration const& the_moment ) { return time_duration( 12, 0, 0 ) + the_moment; } 

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ (рдкрд╛рдпрдерди 3.x рдореЗрдВ):
 from someconv import * from datetime import * # test datetime.datetime <=> boost::posix_time::ptime t = tomorrow(); print( 'Tomorrow at same time:', t ) for _ in range(3): t = day_before(t); print( 'Day before that moment:', t ) # test datetime.date <=> boost::gregorian::date d = last_day_of_this_month(); print( 'Last day of this month:', d ) for _ in range(3): d = year_after(d); print( 'Day before that day:', d ) # test datetime.time <=> boost::posix_time::time_duration at = datetime.now() to = at + timedelta( seconds=12*60*60 ) dt = delta_between( at, to ) print( "Delta between '{at}' and '{to}' is '{dt}'".format( at=at, to=to, dt=dt ) ) t0 = time( 6, 30, 0 ) t1 = plus_midday( t0 ) print( t0, "plus midday is:", t1 ) 

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

C ++ рдореЗрдВ рдмрд╛рдЗрдЯ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╛рдЗрдЯ рд╕рд░рдгреА


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

рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЕрдХрд╛рджрдорд┐рдХ рд╣реИ, рдпрджрд┐ рдЖрдкрдХреЛ рдХрд╣реАрдВ рдореИрдирд┐рдХ рдХреЛрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк C ++ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╛рдпрдерди 2.x рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЦрдВрдб рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рддрдм рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред рдпреВрдирд┐рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдорд╛рдирдХ рд╕реА ++ рд▓рд╛рдЗрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдпрд╡рд┐рдХ рдореЗрдВ рдпрд╣рд╛рдВ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ ред
рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди 3.x рдХреЗ рд▓рд┐рдП, рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реА-рдПрдкреАрдЖрдИ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ ( рдмрд╛рдЗрдЯ рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд 8-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ - uint8_t ) рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдлрд┐рд░ рд╕реЗ рд╣рдо рдЕрдкрдиреА рдЕрджреНрднреБрдд рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдЖрдирдиреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 typedef uint8_t byte; typedef vector<byte> byte_array; ... template<> PyObject* type_into_python<byte_array>::convert( byte_array const& ); template<> void* type_from_python<byte_array>::convertible( PyObject* ); template<> void type_from_python<byte_array>::construct( PyObject*, converter::rvalue_from_python_stage1_data* ); 

рд╕рднреА рд╕рдорд╛рди, рд╣рдо рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
 BOOST_PYTHON_MODULE( ... ) { ... to_python_converter< byte_array, type_into_python<byte_array> >(); type_from_python< byte_array >(); } 

рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рд╣рдо рд╕рд┐рд░реНрдл PyBytes рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ C-API рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ std рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ :: рд╡реЗрдХреНрдЯрд░ рддрд░реАрдХреЗ:
 PyObject* type_into_python<byte_array>::convert( byte_array const& ba ) { const char* src = ba.empty() ? "" : reinterpret_cast<const char*>( &ba.front() ); return PyBytes_FromStringAndSize( src, ba.size() ); } void* type_from_python<byte_array>::convertible( PyObject* obj ) { return PyBytes_Check( obj ) ? obj : nullptr; } void type_from_python<byte_array>::construct( PyObject* obj, converter::rvalue_from_python_stage1_data* data ) { auto storage = reinterpret_cast< converter::rvalue_from_python_storage<byte_array>* >( data )->storage.bytes; byte* dest; Py_ssize_t len; PyBytes_AsStringAndSize( obj, reinterpret_cast<char**>( &dest ), &len ); new(storage) byte_array( dest, dest + len ); data->convertible = storage; } 

рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, PyBytes рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реА-рдПрдкреАрдЖрдИ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рднреЗрдЬреВрдВрдЧрд╛ред

Uuid.UUID рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ :: uuids :: uuid рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд


рдЖрдк рд╣рдБрд╕реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдЙрди рджреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯреЛрдВ рдХреЛ рдмрдирд╛рдХрд░ рдЕрдкрдирд╛ рдХрд╛рдо рдЖрд╕рд╛рди рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдЬреЛ рдлрд┐рд░ рд╕реЗ рддреАрди рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВ:
 using namespace boost::uuids; ... template<> PyObject* type_into_python<uuid>::convert( uuid const& ); template<> void* type_from_python<uuid>::convertible( PyObject* ); template<> void type_from_python<uuid>::construct( PyObject*, converter::rvalue_from_python_stage1_data* ); 

рд╣рдо рдореЙрдбреНрдпреВрд▓ рдШреЛрд╖рдгрд╛ рдореЗрдВ рджреЛ рдирдИ рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рд╡рд╣рд╛рдБ рдФрд░ рдкреАрдЫреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдкрдВрдЬреАрдХрд░рдг:
  to_python_converter< uuid, type_into_python<uuid> >(); type_from_python< uuid >(); 

рдФрд░ рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕реА-рдПрдкреАрдЖрдИ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдпрд╣ рдмрд╛рдзрд╛ рдмрдирдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ :: рдЕрдЬрдЧрд░ :: рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ "рдпреВрдЖрдИрдбреА" рдФрд░ рдЙрд╕реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд░реНрдЧ "рдпреВрдпреВрдЖрдИрдбреА" рдХрд╛ рдЖрдпрд╛рдд рдХрд░реЗрдВред
 static object py_uuid = import( "uuid" ); static object py_uuid_UUID = py_uuid.attr( "UUID" ); PyObject* type_into_python<uuid>::convert( uuid const& u ) { return incref( py_uuid_UUID( object(), byte_array( u.data, u.data + sizeof(u.data) ) ).ptr() ); } void* type_from_python<uuid>::convertible( PyObject* obj ) { return PyObject_IsInstance( obj, py_uuid_UUID.ptr() ) ? obj : nullptr; } void type_from_python<uuid>::construct( PyObject* obj, converter::rvalue_from_python_stage1_data* data ) { auto storage = reinterpret_cast< converter::rvalue_from_python_storage<uuid>* >( data )->storage.bytes; byte_array ba = extract<byte_array>( object( handle<>( borrowed( obj ) ) ).attr( "bytes" ) ); uuid* res = new(storage) uuid; memcpy( res->data, &ba.front(), ba.size() ); data->convertible = storage; } 

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

рдЪреВрдВрдХрд┐ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
Py_uuid рдореЗрдВ, рд╣рдордиреЗ рдкрд╛рдпрдерди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ uuid рдкреНрд▓рдЧ-рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрд╛ рд╣реИред
Py_uuid_UUID рдореЗрдВ рд╣рдордиреЗ рдХреНрд▓рд╛рд╕ uuid.UUID рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗрд╡ рдХрд┐рдпрд╛ред рдпрд╣ рд╕реНрд╡рдпрдВ рд╡рд░реНрдЧ рд╣реИред рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдмреНрд░реИрдХреЗрдЯреНрд╕ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдЖрдПрдЧрд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрди рдЬрд╛рдПрдЧрд╛ред рдмрд╛рдж рдореЗрдВ рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╡рд░реНрдЧ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрднреА рднреА рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ - рдЗрд╕ рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд╕реНрддреБ рдПрдХ UUID рд╣реИред

рдкрд╛рдпрдерди рд╕реЗ, C ++ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдмрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдХреЛрдИ рднреА рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ ( рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ :: python :: рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд░реНрдл рдХреЛрдИ рднреА рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛ ) рдкрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рджреВрд╕рд░рд╛ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рд╕реЗ рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╛рдпрдерди 2.x рд╣реИ, рддреЛ рдХреЛрдб рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рд╣реИред

рдЬрдм рдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ PyObject_IsInstance () рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред
рд╣рдо Pyrbject * рдХреЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ uuid.UUID рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ptr () рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ :: python :: objectред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╡рд░реНрдЧ рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ рдХрд╛рдо рдореЗрдВ рдЖрдИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд╛рдпрдерди рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╕рдорд╛рди рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред рдФрд░ рд╡рд╣ рдорд╣рд╛рди рд╣реИред рдРрд╕реА рддрд╛рд░реНрдХрд┐рдХ рдФрд░ рдмреЛрдзрдЧрдореНрдп рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдпрд╣рд╛рдВ рдкрд╛рдЗрдерди рд╕реЗ C ++ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рд░реЗрдЦрд╛ рдкрд░ рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ:
  byte_array ba = extract<byte_array>( object( handle<>( borrowed( obj ) ) ).attr( "bytes" ) ); 

рдпрд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИред PyObject * рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдП uuid.UUID рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╣рдо рдПрдХ рдкреВрд░реНрдг рдмрдврд╝рд╛рд╡рд╛ :: python :: рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рдВрднрд╛рд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ <> ( рдЙрдзрд╛рд░ (obj)) - рдпрд╣рд╛рдБ рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЙрдзрд╛рд░ рдХреА рдЧрдИ рдХреЙрд▓ рдХреЛ рди рдЦреЛрдПрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдорд╛рд░реА рддрд╛рдЬрд╝рд╛ рд╡рд╕реНрддреБ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдкрд╛рд░рд┐рдд рд╡рд╕реНрддреБ рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрдЧреАред
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ uuid.UUID рдХреЗ рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ Pythbject * рд╕реЗ python :: рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдорд┐рд▓рд╛ред рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБ рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рдЗрдЯ_рдЕрд░реЗ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдордЧреНрд░реА рд╣реИред
рдЬреЛ рд▓реЛрдЧ рдХреНрд░рдордмрджреНрдзрддрд╛-deserialization рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реМрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдХрд┐рд╕реА рднреА lexical_cast () рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЧрд░реНрджрди рдкрд░ рдПрдХ рдкрддреНрдерд░ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ C ++ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдмрдирд╛рдирд╛ рдФрд░ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред
рдкрд╛рдпрдерди 2.x рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддреБрд░рдВрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрдиреЗрдВ, рд╕реА / рд╕реА ++ рдХреА рддрд░рд╣ рд╣реБрдЖ рдХрд░рддреА рдереАрдВ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЪрд╛рд░ * рдХреЗ рдЬрд░рд┐рдПред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реЛрддрд╛ рд╣реИ, рд╕рд░рдгреА рднрд░реЗрдВ, рдореБрдЭреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдирдХрд▓ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдФрд░ рдкреВрд░реА рдХреА рд╣реБрдИ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ C ++ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред

рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдФрд░ рдпреВрдпреВрдЖрдИрдбреА рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ


рдЖрдЗрдП рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдп рдХрд░реЗрдВ рдЬреЛ C ++ рдФрд░ рдкрд╛рдпрдерди рдХреЗ рдмреАрдЪ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
 byte_array string_to_bytes( string const& src ); string bytes_to_string( byte_array const& src ); uuid random_uuid(); byte_array uuid_bytes( uuid const& src ); 

рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкрд╛рдпрдерди рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ:
 BOOST_PYTHON_MODULE( someconv ) { ... def( "string_to_bytes", string_to_bytes, args( "src" ) ); def( "bytes_to_string", bytes_to_string, args( "src" ) ); def( "random_uuid", random_uuid ); def( "uuid_bytes", uuid_bytes, args( "src" ) ); ... } 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рддрдерд╛рдкрд┐, рдЖрдЗрдП рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ:
 byte_array string_to_bytes( std::string const& src ) { return byte_array( src.begin(), src.end() ); } string bytes_to_string( byte_array const& src ) { return string( src.begin(), src.end() ); } uuid random_uuid() { static random_generator gen_uuid; return gen_uuid(); } byte_array uuid_bytes( uuid const& src ) { return byte_array( src.data, src.data + sizeof(src.data) ); } 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдРрд╕реА рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдкрд╛рдпрдерди 3.x рдореЗрдВ):
 from someconv import * from uuid import * ... # test bytes <=> std::vector<uint8_t> print( bytes_to_string( b"I_must_be_string" ) ) print( string_to_bytes( "I_must_be_byte_array" ) ) print( bytes_to_string( " - !".encode() ) ) print( string_to_bytes( " - !" ).decode() ) print( bytes_to_string( string_to_bytes( " -  !" ) ) ) # test uuid.UUID <=> boost::uuids::uuid u = random_uuid() print( 'Generated UUID (C++ module):', uuid_bytes(u) ) print( 'Generated UUID (in Python): ', u.bytes) 

рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:
 I_must_be_string b'I_must_be_byte_array' - ! - ! -  ! Generated UUID (C++ module): b'\xf1B\xdb\xa9<lL\x9d\x9a\xfd\xf3\xe9\x9f\xa6\x9aT' Generated UUID (in Python): b'\xf1B\xdb\xa9<lL\x9d\x9a\xfd\xf3\xe9\x9f\xa6\x9aT' 

рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдерди рд╕реЗ UUID рдХреЗ рдХрд╡рд░ рд╕реЗ C ++ рддрдХ рдЙрдзрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ рдареАрдХ рд╕реЗ рдЧрд┐рд░ рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╣реА рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░


рд╣рдордиреЗ рди рдХреЗрд╡рд▓ рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕ рд▓рд┐рдЦрдирд╛, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдирд╛, рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╢реНрд░рдо рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдирд╛ рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реАрдЦрд╛ред рдЕрд╕рд▓ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд▓рд┐рдВрдХ рдпрд╣рд╛рдВ рд╣реИ (~ 207 KB) ред MSVS v11 рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдЬрд┐рд╕реЗ Python 3.3 x64 рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ


Boost.Python рдкреНрд░рд▓реЗрдЦрди
рдХреИрд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрдирд╡рд░реНрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
рдХрдиреНрд╡рд░реНрдЯ рдпреВрдирд┐рдХреЛрдб рдХреЛ рдЕрдЬрдЧрд░ 2.x
C ++ рдФрд░ рдкрд╛рдпрдерди рдХреЗ рдмреАрдЪ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛
рджрд┐рдирд╛рдВрдХ / рд╕рдордп рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк

Source: https://habr.com/ru/post/In168827/


All Articles