Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update of pybind11 Python bindings. #78

Closed
wants to merge 1 commit into from
Closed

Update of pybind11 Python bindings. #78

wants to merge 1 commit into from

Conversation

stanislavsulc
Copy link
Contributor

Update of pybind11 Python bindings. Enabled dynamic attributes for FEMComponent (and derived classes) to enable easier usage via Python.

…MComponent (and derived classes) to enable easier usage via Python.
@bpatzak
Copy link
Member

bpatzak commented Mar 24, 2020

Ahoj Stando,
ted je to ok az na jednu vec. Proc jsi povolil dynamicke atributy? K cemu to potrebujes?
To je trochu proti filozofii oofemu, vse se nastavuje a updatuje metodami, ktere jedine mohou zajistit konzistenci vnitrniho stavu objektu, pokud budes menit atributy z venku, muze to mit dusledky.
Borek

@stanislavsulc
Copy link
Contributor Author

Ahoj Bořku, dynamické atributy jsou potřeba, protože, některé třídy nejsou do Pythonu exponované v oofem.cpp (například okrajové podmínky), a nelze z nich tedy udělat novou vlastní třídu v pythonu (jako v případě těch, které v oofem.cpp jsou), do které si už přidáš parametry, které potřebuješ. Pak člověk narazí na to, že si na instancích některých tříd nemůžeš nastavit nic vlastního a jedinou možností pak je mít nějaké další seznamy, ve kterých máš odkazy na tyto instance a zároveň ony dodatečné parametry, což je velice neohrabané. Kdyby bylo rovnou vše v oofem.cpp, tak by to bylo v pořádku, ale se současným konceptem provázání s Pythonem některé věci realizovat nelze. Alespoň takto jsem na ta omezení narazil já, možná to má i jiná řešení.
Standa

@bpatzak
Copy link
Member

bpatzak commented Mar 26, 2020

Ahoj Stando,
me se to nelibi proto, ze to otevira pandorinu skrinku. Ani v C++ nemuzes v oofemu menit jednotlive parametry primo, jsou protected a vse probiha prostrednictvim metod. To je jedina spravna cesta, protoze kdyz nastavis natvrdo nejaky atribut, aniz by o tom objekt vedel, muzes ho uvest do nekonzistentniho stavu a takove chyby se pak blbe hledaji.
Takze navrhuji dve moznosti:

  • bud si udelas bindings na vsechny tridy, ktere potrebujes a zpristupnis si prislusne get/set metody
  • nebo napr. na obecne urovni pro vsechny bundary condition se prida genericka get/set metoda, ktera umozni nasetovat/vratit prislusny parameter. Rozdil od primeho meneni atributu je zde v tom, ze nakonec tu get/set metodu pretizi a implementuje kazda individualni trida a tedy objekt o zmene bude informovan.

@stanislavsulc
Copy link
Contributor Author

Ahoj Bořku,

podle toho co jsem zkoušel, tak pokud má v oofemu například element na sobě proměnnou int material, tak díky tomu, že je protected a není exponovaná do Pythonu, tak tuto hodnotu z Pythonu změnit nelze. Pokud pak v Pythonu nastavím na elementu proměnnou material, jedná se o proměnnou Pythonu a nijak to oofem neovlivňuje, takže oofemu by toto vlastně mohlo být úplně jedno. Dynamické atributy jsou principielní vlastností Pythonu a pokud nebude možnost je na instancích tříd oofemu v Pythonu používat, tak je to velká škoda, protože se částečně přichází o eleganci Pythonu.

To, jakým způsobem jsou v současné době do Pythonu exponované například ty zmiňované okrajové podmínky, koliduje s jejich exponováním v souboru oofem.cpp, takže je otázkou, jestli se touto cestou pouštět, když to jde vyřešit elegantněji. Navíc když se do toho začne hrabat, tak pravděpodobně některé věci lidem v Pythonu přestanou fungovat.

Je mi jasné, že to takto neschválíš, ale já sám nevidím důvod, proč bychom dynamické atributy neměli používat, když to neovlivňuje protected proměnné v oofemu, čímž se mi to jeví jako bezpečné.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants