2424
2525import copy
2626import inspect
27- import mmtf
28- import parmed as pmd
29- import numpy as np
30- from MDAnalysis .lib .util import isstream
3127
32- from .. import _READERS , _PARSERS , _MULTIFRAME_WRITERS , _SINGLEFRAME_WRITERS , _CONVERTERS
28+ from .. import (_READERS , _READER_HINTS ,
29+ _PARSERS , _PARSER_HINTS ,
30+ _MULTIFRAME_WRITERS , _SINGLEFRAME_WRITERS , _CONVERTERS )
3331from ..lib import util
3432
3533
@@ -77,26 +75,23 @@ def get_reader_for(filename, format=None):
7775 :class:`~MDAnalysis.coordinates.chain.ChainReader` is returned and `format`
7876 passed to the :class:`~MDAnalysis.coordinates.chain.ChainReader`.
7977
78+ .. versionchanged:: 1.0.0
79+ Added format_hint functionalityx
8080 """
8181 # check if format is actually a Reader
8282 if inspect .isclass (format ):
8383 return format
8484
8585 # ChainReader gets returned even if format is specified
86- if not isinstance ( filename , np . ndarray ) and util . iterable ( filename ) and not isstream (filename ):
86+ if _READER_HINTS [ 'CHAIN' ] (filename ):
8787 format = 'CHAIN'
8888 # Only guess if format is not specified
89- elif format is None :
90- # Checks for specialised formats
91- if isinstance (filename , np .ndarray ):
92- # memoryreader slurps numpy arrays
93- format = 'MEMORY'
94- elif isinstance (filename , mmtf .MMTFDecoder ):
95- # mmtf slurps mmtf object
96- format = 'MMTF'
97- elif isinstance (filename , pmd .Structure ):
98- format = 'PARMED'
99- else :
89+ if format is None :
90+ for fmt_name , test in _READER_HINTS .items ():
91+ if test (filename ):
92+ format = fmt_name
93+ break
94+ else : # hits else if for loop completes
10095 # else let the guessing begin!
10196 format = util .guess_format (filename )
10297 format = format .upper ()
@@ -231,16 +226,18 @@ def get_parser_for(filename, format=None):
231226 ValueError
232227 If no appropriate parser could be found.
233228
229+ .. versionchanged:: 1.0.0
230+ Added format_hint functionality
234231 """
235232 if inspect .isclass (format ):
236233 return format
237234
238235 # Only guess if format is not provided
239236 if format is None :
240- if isinstance ( filename , mmtf . MMTFDecoder ):
241- format = 'mmtf'
242- elif isinstance ( filename , pmd . Structure ):
243- format = 'PARMED'
237+ for fmt_name , test in _PARSER_HINTS . items ( ):
238+ if test ( filename ):
239+ format = fmt_name
240+ break
244241 else :
245242 format = util .guess_format (filename )
246243 format = format .upper ()
@@ -286,4 +283,4 @@ def get_converter_for(format):
286283 except KeyError :
287284 errmsg = 'No converter found for {} format'
288285 raise_from (TypeError (errmsg .format (format )), None )
289- return writer
286+ return writer
0 commit comments