2013-07-31 5 views
6

मान लें कि मेरे पास कुछ जटिल है जो कुछ जटिल काम करता है।matlab कार्यों में verbosity को नियंत्रित करने के लिए विचार/सर्वोत्तम प्रथाओं

function foo = some_complicated_fun(x,y,z,verbosity) 

मैं इस कोड में प्रिंट डिबगिंग का एक अच्छा सा लिखा है, लेकिन औसत उपयोगकर्ता यह सब देखकर अगर यह काम कर रहा है में कोई दिलचस्पी नहीं हो सकता है। त्रुटि बयान (पर्याप्त तर्क नहीं, आदि) परवाह किए बिना प्रिंट करेंगे।

एक समारोह लिखने के लिए मेरे वर्तमान विधि है:

function foo = some_complicated_fun(x,y,z,verbosity) 

(x,y,z,verbosity) = parse_args(x,y,z,verbosity); % parse args, check nargin, etc 

for i=1:5, 

    % whatever  
    % do some work with x,y,z 
    % blah blah 

    if verbosity 
     fprintf('Now on iteration %i\n',i); % basic print 
    end 

    % or, with mutiple levels: 
    if verbosity == 1; 
     fprintf('Now on iteration %i\n',i); % basic print 
    end 
    if verbosity == 2; 
     fprintf('x = %f,y = %f,z=%f %i\n',x,y,z); % more information 
    end 

    % do more work 

end 

मैं अगर क्योंकि बयान यह clutters ऊपर कोड के साथ कर रही है पसंद नहीं है, लेकिन मैं किसी अन्य तरीके से नहीं सोच सकते हैं। एक एक लाइनर बेहतर और बदतर है:

if verbosity; fprintf('Iteration %i\n',i); end 

बेहतर है क्योंकि यह छोटा होता है, बुरा है क्योंकि एक-लाइनर्स 3 लाइनों पर एक ही बात की तुलना में कम पढ़े जा सकते हैं।

मैं क्या चाहता हूं वर्बसिटी को नियंत्रित करने के लिए कुछ सरल, अधिक सुरुचिपूर्ण तरीका है।

क्या यह अस्तित्व में है?

उत्तर

1

मैं लॉग उत्पादन शब्दाडंबर नियंत्रित करने के लिए एक विधि बनाया है। यह अभी तक पूरा नहीं हुआ है, लेकिन जब से यह सवाल दिखाई दिया मैं इसे करने के लिए अपलोड किया गया:

This link at Matlab File Exchange.

यह वांछित स्तर तक वैश्विक उत्पादन लॉग सेटिंग के द्वारा काम करता है, और निम्न स्वरूप पर संदेश दिखाएगा:

OUTPUT_LEVEL: function_which_called_message  Your_Message. 

हालांकि, यह केवल आपके द्वारा सेट किए गए आउटपुट स्तर से अधिक संदेशों को आउटपुट करेगा। डिफ़ॉल्ट केवल INFO संदेशों या उच्चतर प्रदर्शित करना है, इसलिए यह DEBUG और VERBOSE संदेशों को नहीं दिखाएगा। आप डिबग संदेश देखने के लिए चाहते हैं, तो आप सेट:

Output.level(Output.DISP_DEBUG) 

आउटपुट तरीके हैं:

Output.VERBOSE 
Output.DEBUG 
Output.INFO 
Output.WARNING 
Output.ERROR 

आप संदेशों को चुनने के रूप में Output.'DESIRED_LEVEL'('message',input_1,input2) कार्य करके अपना कार्यों में प्रदर्शित करने के लिए sprintf या fprintf matlab प्रारूप। आईई, Output.INFO('The variable value is %d',variable)। चेतावनी और त्रुटि संदेशों के लिए आप पहचानकर्ता को 'पैकेज: विधि: ERROR_ID' के रूप में भी निर्दिष्ट कर सकते हैं, और ऐसा करके, आउटपुट matlab के warning और error फ़ंक्शंस पर होगा। आईई Output.WARNING('MY_PACKAGE:MY_METHOD:MY_ID','Something wrong happened here!')

उत्पादन स्तर उपलब्ध हैं:

Output.level(Output.DISP_VERBOSE) % Show all messages 
Output.level(Output.DISP_DEBUG) % Show debug info warning errors 
Output.level(Output.DISP_INFO) % Show info warning errors 
Output.level(Output.DISP_WARNING) % Show warning errors 
Output.level(Output.DISP_MUTE) % Show only errors. 

तुम भी

Output.place('file_path') 

का उपयोग करके एक लॉग फ़ाइल के लिए उत्पादन निर्दिष्ट और लॉग फ़ाइल की जगह ले सकता (आप भी वर्तमान लॉग पुनर्स्थापित करने के लिए उपयोग कर सकते हैं) :

Output.place('file_path',true) 

या यह रीसेट

स्क्रीन करने के लिए 0
Output.place(1) 

यहाँ उत्पादन स्तर DISP_VERBOSE का उपयोग कर उत्पादन का एक नमूना है:

>> nilmContainer = NilmFileContainer.newRun('inputFolder','sim_real/','runName','RealHouse','samplesPerFile',60*60*60); 
VERBOSE: getFilesOnFolder    Found 2 files on folder 'data/sim_real/'. They are the following: 
VERBOSE: getFilesOnFolder     [1]:data/sim_real/240AM000.csv 
VERBOSE: getFilesOnFolder     [2]:data/sim_real/240AM001.csv 
DEBUG: NilmFileContainer.setRunName Updating run name to RealHouse_Run5. 
INFO: newRun       Reading file data/sim_real/240AM000.csv. 
VERBOSE: csv_data      Reading samples (Ignored:0,Read:216000,Remaining:2422014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_1-19:12:46-30_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:216000,Read:216000,Remaining:2206014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_2-20:12:45-30_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:432000,Read:216000,Remaining:1990014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_3-21:12:45-30_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:648000,Read:216000,Remaining:1774014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_4-22:12:45-30_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:864000,Read:216000,Remaining:1558014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_5-23:12:45-30_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:1080000,Read:216000,Remaining:1342014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_6-00:12:44-31_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:1296000,Read:216000,Remaining:1126014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_7-01:12:43-31_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:1512000,Read:216000,Remaining:910014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_8-02:12:43-31_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:1728000,Read:216000,Remaining:694014) at file: sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_9-03:12:43-31_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:1944000,Read:216000,Remaining:478014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_10-04:12:42-31_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:2160000,Read:216000,Remaining:262014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_11-05:12:41-31_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:2376000,Read:216000,Remaining:46014) at file: data/sim_real/240AM000.csv. 
DEBUG: addFiles      Writing file 'data/NILM_DATA/RealHouse_Run5/RealHouse_Run5-File_12-06:12:41-31_10_2012.mat' 
VERBOSE: csv_data      Reading samples (Ignored:2592000,Read:46014,Remaining:0) at file: data/sim_real/240AM000.csv. 
VERBOSE: csv_data      Reading samples (Ignored:0,Read:169986,Remaining:2799058) at file: data/sim_real/240AM001.csv. 
INFO: readFile      Found discontinuity while changing from file 'data/sim_real/240AM000.csv' to 'data/sim_real/240AM001.csv'. 

जैसा कि मैंने कहा, यह अंतिम संस्करण में नहीं है, लेकिन तुम मुझे यह बेहतर बनाने में मदद कर सकते हैं! एक्स)

+1

यह बहुत अच्छा लग रहा है! – Frederick

2

fprintf को प्रतिस्थापित करने के लिए एक फ़ंक्शन को परिभाषित करें, जिसमें if कथन और वास्तविक प्रिंटिंग शामिल है। और verbosity को global चर के रूप में घोषित करें, इसे हर बार एक तर्क के रूप में पारित करने से बचने के लिए।

1

यही वह है जो मैंने किया।

मैं एक समारोह (मैं इसे vprintf कहा जाता है, लेकिन वहाँ बेहतर नाम हैं।)

मुझे यकीन है कि मैं वैश्विक चर क्या करना चाहते हैं नहीं कर रहा हूँ लिखा था, लेकिन है कि एक विचार है।

function vprintf(v,l,varargin) 
% VPRINTF(verbosity, verbosity_level_of_statement,sprintf_style_arguments 
% 
% 
% example: 
% 
% verbosity = 1; 
% vprintf(verbosity,1,'This will print if verbosity is at least 1\n Verbosity = %i\n',verbosity); 

if nargin<3 
    error('not enough arguments'); 
end 
if v>=l % if verbosity level is >= level of this statment 
%  keyboard; 
    fprintf(varargin{:}); 
end 
1

फ्रेडरिक और लुइस Mendo से जवाब पर एक सुधार के रूप में आप अपने समारोह के अंत में एक nested function के रूप में अपने vprintf समारोह को परिभाषित कर सकते हैं। इसके पास verbosity तर्क की पहुंच होगी और आपको वैश्विक चर की आवश्यकता नहीं होगी। आपका कोड इस तरह दिखेगा:

function foo = some_complicated_fun(x,y,z,verbosity) 

[x,y,z,verbosity] = parse_args(x,y,z,verbosity); % parse args, check nargin, etc 

for i=1:5, 

    % whatever  
    % do some work with x,y,z 
    % blah blah 

    vprintf(1,'Now on iteration %i\n',i); % basic print 

    % or, with mutiple levels: 
    vprintf(1,'Now on iteration %i\n',i); % basic print 
    vprintf(2,'x = %f,y = %f,z=%f %i\n',x,y,z); % more information 

    % do more work 
end 

    % time to define vprintf 
    function vprintf(l,varargin) 
    % VPRINTF(verbosity, verbosity_level_of_statement,sprintf_style_arguments 
    % 
    % 
    % example: 
    % 
    % verbosity = 1; 
    % vprintf(1,'This will print if verbosity is at least 1\n Verbosity = %i\n',verbosity); 

    if nargin<2 
     error('not enough arguments'); 
    end 
    if verbosity>=l % if verbosity level is >= level of this statment 
    %  keyboard; 
     fprintf(varargin{:}); 
    end 
end 

संपादित रख-रखाव मुद्दा गुंथर Struyf टिप्पणी में उल्लेख किया है पर काबू पाने के लिए, आपको vprintf में लगातार चर में verbosity मूल्य रखने के लिए और पहली कॉल में सेट कर सकते हैं।

function vprintf(vl,varargin) 
% VPRINTF(verbosity); 
% VPRINTF(verbosity_level_of_statement,sprintf_style_arguments); 

persistent verbosity 
if nargin==1 
    verbosity = vl; 
elseif isempty(verbosity) 
    error('verbosity level not set'); 
end 

if verbosity>=vl % if verbosity level is >= level of this statment 
%  keyboard; 
    fprintf(varargin{:}); 
end 

फिर foo समारोह में यह शुरू में स्थापना की और बाद में बयान में इसका इस्तेमाल करते हैं। हो सकता है कि एक अच्छा अभ्यास द्वारा vprintf([]);

function foo = some_complicated_fun(x,y,z,verbosity) 

[x,y,z,verbosity] = parse_args(x,y,z,verbosity); % parse args, check nargin, etc 

vprintf(verbosity); 
for i=1:5, 

    % whatever  
    % do some work with x,y,z 
    % blah blah 

    vprintf(1,'Now on iteration %i\n',i); % basic print 

    % or, with mutiple levels: 
    vprintf(1,'Now on iteration %i\n',i); % basic print 
    vprintf(2,'x = %f,y = %f,z=%f %i\n',x,y,z); % more information 

    % do more work 
end 
vprintf([]); 
+0

लेकिन फिर आपको उस कार्यक्षमता का उपयोग करना होगा जो उस कार्यक्षमता का उपयोग करता है/उस कार्यक्षमता का उपयोग करता है जो दर्द होगा, खासकर यदि आप उस नेस्टेड फ़ंक्शन –

+0

@GuntherStruyf में कुछ बदलना चाहते हैं तो यह सच है। यह निर्भर करता है कि यह कोड पूरे कोड बेस में कितना प्रचलित है। मैंने वैश्विक चर के बजाय लगातार चर का उपयोग करके एक और समाधान जोड़ा। –

0

बाहर निकलने में मूल्य स्पष्ट करने के लिए मैं यह करने के लिए चाहते थे चाहते हैं, तो मैं logDebug, logInfo, logWarning और logError जैसे कार्यों के साथ this करने के लिए एक लॉगर वर्ग, समान बना सकते हैं । (मैंने वास्तव में यह lua here) के लिए किया है।

आपको निर्माण पर loglevel सेट करना होगा, और पूर्ण कार्यक्षमता और कार्यों को लॉगर ऑब्जेक्ट के दायरे में एक्सेस किया जा सकता है (इसलिए कोई वैश्विक स्कोप प्रदूषण और एकाधिक एम-फाइलों में आसान कार्यान्वयन नहीं)।

इस वर्ग की तो अंतिम उपयोग इस प्रकार दिखाई देगा:

%% my fancy script 
% init 
logger = Logger(Logger.LOGDEBUG) 
logger.logDebug('script initialized'); 

% plot some stuff 
logger.logDebug('commencing plot'); 
plot(rand(4)); 
logger.logInfo('fancy script ended'); 
संबंधित मुद्दे

 संबंधित मुद्दे