Python не возвращает Noneobject, когда он должен возвращать корневой объект TDirectoryFile
Поэтому я использую Pyroot для анализа данных. Цепочка кодов анализа запускает различные плагины для данных и выводит их в корневой файл, сохраняя выходные данные каждого плагина в свой собственный файл TDirectoryFile в корневом файле. Я написал функцию, которая берет имя корневого файла и имя плагина и должна возвращать плагины TDirectoryFile. Однако он возвращает вместо NoneType, а затем падает, как только я пытаюсь что-то сделать с объектом.
from ROOT import *
def getPluginData(fName,pName):
tfile=TFile("Analyzer.root")
plugin= tfile.Get("MuIndNeuSpallPlugin")
#outputs <class 'ROOT.TDirectoryFile'>
print type(MuIndNeuSpallPlugin)
return plugin
#This should be a <class 'ROOTTDirectoryFile'.>, but is a NoneType instead
MuIndNeuSpallPlugin=getPluginData("Analyzer.root","MuIndNeuSpallPlugin")
1 ответ
Так что в моем посте о root talk ( https://root.cern.ch/phpBB3/viewtopic.php?f=14&t=23242)a постер объяснил, почему это происходит. По существу, tfile определен в функции, и когда функция удаляется, ее счетчик использования уменьшается до 0, а ее версия на C++ удаляется. Плагин, который является TDirectoryFile, содержится в tfile, поэтому, когда tfile удаляется, он идет вместе с ним. Решение состоит в том, чтобы определить tfile в глобальной области видимости, передать его вместо строки имени файла.
ROOT import *
def getPluginData(tfile,pName):
plugin= tfile.Get(pName)
print type(MuIndNeuSpallPlugin)
return plugin
tfile=TFile("Analyzer.root")
MuIndNeuSpallPlugin=getPluginData(tfile,"MuIndNeuSpallPlugin")
Это работает, но я чувствую, что это противоречит интуитивному или, по крайней мере, не очень питоническому, и как бы ломает питона.