LSSTApplications  19.0.0-14-gb0260a2+d60062ef16,20.0.0+1540ce6389,20.0.0+7c6b12c2f9,20.0.0+ae956f52c5,20.0.0+be870186d9,20.0.0+e2e26847c2,20.0.0-1-g10df615+7683e4f082,20.0.0-1-g253301a+7c6b12c2f9,20.0.0-1-g2b7511a+46a6078777,20.0.0-1-g3dda6ea+606b36f8c0,20.0.0-1-g4d801e7+901ee84527,20.0.0-1-g5b95a8c+a5fa15ec54,20.0.0-1-gb058bd0+46a6078777,20.0.0-1-gb88604f+acecce4127,20.0.0-1-gc96f8cb+61a4a056b1,20.0.0-1-gedffbd8+4f0e391d5e,20.0.0-10-g0891cd99+aadc987f3e,20.0.0-10-g9a20bd332+576ca7b471,20.0.0-17-gcdbda88+ed0d4927ab,20.0.0-2-g4dae9ad+61a4a056b1,20.0.0-2-g61b8584+85c46248f3,20.0.0-2-gb780d76+f45b7d88f4,20.0.0-2-gf072044+7c6b12c2f9,20.0.0-21-g9bbb7f7+61a4a056b1,20.0.0-22-gc512666+9eba1c4719,20.0.0-23-g8900aa8+68630f7098,20.0.0-3-g1653f94+85c46248f3,20.0.0-3-g4cc78c6+63636aeed8,20.0.0-3-g750bffe+e05f822de9,20.0.0-3-gbd60e8c+ff10c6d78d,20.0.0-32-g15a0e07c+ff1c9f120b,20.0.0-4-g97dc21a+68630f7098,20.0.0-4-gfea843c+f45b7d88f4,20.0.0-5-g357b56b+f45b7d88f4,20.0.0-6-g9a5b7a1+2c4171520d,20.0.0-61-g4de25fb+e4dd172200,20.0.0-7-gcda7bf1+85e953d7e4,w.2020.43
LSSTDataManagementBasePackage
utils.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 #
4 # LSST Data Management System
5 # Copyright 2016 LSST Corporation.
6 #
7 # This product includes software developed by the
8 # LSST Project (http://www.lsst.org/).
9 #
10 # This program is free software: you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation, either version 3 of the License, or
13 # (at your option) any later version.
14 #
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 # GNU General Public License for more details.
19 #
20 # You should have received a copy of the LSST License Statement and
21 # the GNU General Public License along with this program. If not,
22 # see <http://www.lsstcorp.org/LegalNotices/>.
23 #
24 from collections.abc import Sequence, Set, Mapping
25 
26 
27 # -*- python -*-
28 
29 def listify(x):
30  """Takes any object and puts that whole object in a list:
31  - strings will be made into a single element in the list
32  - tuples will be converted to list
33  - lists will remain as lists
34  - None will be made into an empty list
35  """
36  if x is None:
37  x = []
38  elif isinstance(x, str):
39  x = [x]
40  elif isinstance(x, dict):
41  x = [x]
42  elif hasattr(x, '__iter__'):
43  x = list(x)
44  else:
45  x = [x]
46  return x
47 
48 
49 def iterify(x):
50  """Takes any object. Returns it if it is iterable. If it
51  is not iterable it puts the object in a list and returns
52  the list. None will return an empty list. If a new list
53  is always required use listify(). Strings will be placed
54  in a list with a single element.
55  """
56  if x is None:
57  x = []
58  elif isinstance(x, str):
59  x = [x]
60  elif hasattr(x, '__iter__'):
61  pass
62  else:
63  x = [x]
64  return x
65 
66 
67 def sequencify(x):
68  """Takes an object, if it is a sequence return it,
69  else put it in a tuple. Strings are not sequences.
70  If x is a dict, returns a sorted tuple of keys."""
71  if isinstance(x, (Sequence, Set)) and not isinstance(x, str):
72  pass
73  elif isinstance(x, Mapping):
74  x = tuple(sorted(x.keys()))
75  else:
76  x = (x, )
77  return x
78 
79 
80 def setify(x):
81  """Take an object x and return it in a set.
82 
83  If x is a container, will create a set from the contents of the container.
84  If x is an object, will create a set with a single item in it.
85  If x is a string, will treat the string as a single object (i.e. not as a list of chars)"""
86  if x is None:
87  x = set()
88 
89  # Here we have to explicity for strings because the set initializer will use each character in a string as
90  # a separate element. We cannot use the braces initialization because x might be a list, and we do not
91  # want the list to be an item; we want each item in the list to be represented by an item in the set.
92  # Then, we have to fall back to braces init because if the item is NOT a list then the set initializer
93  # won't take it.
94  if isinstance(x, str):
95  x = set([x])
96  else:
97  try:
98  x = set(x)
99  except TypeError:
100  x = set([x])
101  return x
102 
103 
104 def doImport(pythonType):
105  """Import a python object given an importable string"""
106  try:
107  if not isinstance(pythonType, str):
108  raise TypeError("Unhandled type of pythonType, val:%s" % pythonType)
109  # import this pythonType dynamically
110  pythonTypeTokenList = pythonType.split('.')
111  importClassString = pythonTypeTokenList.pop()
112  importClassString = importClassString.strip()
113  importPackage = ".".join(pythonTypeTokenList)
114  importType = __import__(importPackage, globals(), locals(), [importClassString], 0)
115  pythonType = getattr(importType, importClassString)
116  return pythonType
117  except ImportError:
118  pass
119  # maybe python type is a member function, in the form: path.to.object.Class.funcname
120  pythonTypeTokenList = pythonType.split('.')
121  importClassString = '.'.join(pythonTypeTokenList[0:-1])
122  importedClass = doImport(importClassString)
123  pythonType = getattr(importedClass, pythonTypeTokenList[-1])
124  return pythonType
lsst::daf::persistence.utils.doImport
def doImport(pythonType)
Definition: utils.py:104
lsst::daf::persistence.utils.sequencify
def sequencify(x)
Definition: utils.py:67
lsst::daf::persistence.utils.listify
def listify(x)
Definition: utils.py:29
lsst::daf::persistence.utils.setify
def setify(x)
Definition: utils.py:80
list
daf::base::PropertyList * list
Definition: fits.cc:913
lsst::daf::persistence.utils.iterify
def iterify(x)
Definition: utils.py:49
set
daf::base::PropertySet * set
Definition: fits.cc:912