aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Tilloy <olivier@tilloy.net>2007-03-29 22:39:07 +0200
committerOlivier Tilloy <olivier@tilloy.net>2007-03-29 22:39:07 +0200
commit528565f796961abb449106038c8dfa03b525287d (patch)
tree3475d30d4073604053b7847eef462d3e7ceb0d0c
parentf3bbb762f758aa21f0bb2d321e4d26de064068e0 (diff)
downloadpyexiv2-528565f796961abb449106038c8dfa03b525287d.tar.gz
Getters and setters for EXIF and IPTC tags are now private (but beware! Python's concept of privacy does not totally forbid access to those members, it just makes them less straightforward), from the client's point of view, metadata should always be accessed using operator [].
-rw-r--r--src/libpyexiv2.hpp2
-rw-r--r--src/libpyexiv2_wrapper.cpp16
-rw-r--r--src/pyexiv2.py46
-rw-r--r--todo1
4 files changed, 34 insertions, 31 deletions
diff --git a/src/libpyexiv2.hpp b/src/libpyexiv2.hpp
index 619304a..9f6d7c5 100644
--- a/src/libpyexiv2.hpp
+++ b/src/libpyexiv2.hpp
@@ -43,7 +43,7 @@ namespace LibPyExiv2
public:
// Constructors
Image(std::string filename);
- Image(const Image & image);
+ Image(const Image& image);
void readMetadata();
void writeMetadata();
diff --git a/src/libpyexiv2_wrapper.cpp b/src/libpyexiv2_wrapper.cpp
index 16c54ea..58f7c7b 100644
--- a/src/libpyexiv2_wrapper.cpp
+++ b/src/libpyexiv2_wrapper.cpp
@@ -36,20 +36,22 @@ BOOST_PYTHON_MODULE(libpyexiv2)
{
register_exception_translator<Exiv2::Error>(&translateExiv2Error);
+ // Exported method names prefixed by "_Image__" are going to be "private"
+ // and are not meant to be used directly
class_<Image>("Image", init<std::string>())
.def("readMetadata", &Image::readMetadata)
.def("writeMetadata", &Image::writeMetadata)
.def("getAvailableExifTags", &Image::getAvailableExifTags)
.def("isExifTagSet", &Image::isExifTagSet)
- .def("getExifTag", &Image::getExifTag)
- .def("getExifTagToString", &Image::getExifTagToString)
- .def("setExifTag", &Image::setExifTag)
- .def("deleteExifTag", &Image::deleteExifTag)
+ .def("_Image__getExifTag", &Image::getExifTag)
+ .def("_Image__getExifTagToString", &Image::getExifTagToString)
+ .def("_Image__setExifTag", &Image::setExifTag)
+ .def("_Image__deleteExifTag", &Image::deleteExifTag)
.def("getAvailableIptcTags", &Image::getAvailableIptcTags)
.def("isIptcTagSet", &Image::isIptcTagSet)
- .def("getIptcTag", &Image::getIptcTag)
- .def("setIptcTag", &Image::setIptcTag)
- .def("deleteIptcTag", &Image::deleteIptcTag)
+ .def("_Image__getIptcTag", &Image::getIptcTag)
+ .def("_Image__setIptcTag", &Image::setIptcTag)
+ .def("_Image__deleteIptcTag", &Image::deleteIptcTag)
.def("getThumbnailData", &Image::getThumbnailData)
.def("setThumbnailData", &Image::setThumbnailData)
.def("deleteThumbnail", &Image::deleteThumbnail)
diff --git a/src/pyexiv2.py b/src/pyexiv2.py
index 5d04524..88ac9b3 100644
--- a/src/pyexiv2.py
+++ b/src/pyexiv2.py
@@ -44,6 +44,8 @@ libpyexiv2.Image.
A typical use of this binding is as follows:
+# TODO: update this documentation!
+
import pyexiv2
import datetime
image = pyexiv2.Image('path/to/imagefile')
@@ -291,7 +293,7 @@ class Image(libpyexiv2.Image):
self.__exifTagsDict = {}
self.__iptcTagsDict = {}
- def getExifTagValue(self, key):
+ def __getExifTagValue(self, key):
"""
Get the value associated to a key in EXIF metadata.
@@ -303,7 +305,7 @@ class Image(libpyexiv2.Image):
Keyword arguments:
key -- the EXIF key of the requested metadata tag
"""
- tagType, tagValue = self.getExifTag(key)
+ tagType, tagValue = self.__getExifTag(key)
if tagType == 'Byte':
return tagValue
elif tagType == 'Ascii':
@@ -336,11 +338,11 @@ class Image(libpyexiv2.Image):
# string, each code being followed by a blank space (e.g.
# "48 50 50 49 " for "0221").
# Note: in the case of tag "Exif.Photo.UserComment", it is better to
- # call method getExifTagToString() to obtain directly the value as a
- # human-readable string.
+ # call method __getExifTagToString() to obtain directly the value as
+ # a human-readable string.
return UndefinedToString(tagValue)
- def setExifTagValue(self, key, value):
+ def __setExifTagValue(self, key, value):
"""
Set the value associated to a key in EXIF metadata.
@@ -369,7 +371,7 @@ class Image(libpyexiv2.Image):
# a string correctly formatted, using utility function
# StringToUndefined().
strVal = str(value)
- self.setExifTag(key, strVal)
+ self.__setExifTag(key, strVal)
def __convertIptcTagValueToPythonType(self, (tagType, tagValue)):
"""
@@ -393,7 +395,7 @@ class Image(libpyexiv2.Image):
elif tagType == 'Undefined':
return tagValue
- def getIptcTagValue(self, key):
+ def __getIptcTagValue(self, key):
"""
Get the value(s) associated to a key in IPTC metadata.
@@ -408,10 +410,10 @@ class Image(libpyexiv2.Image):
Keyword arguments:
key -- the IPTC key of the requested metadata tag
"""
- typeValuesList = self.getIptcTag(key)
+ typeValuesList = self.__getIptcTag(key)
return map(self.__convertIptcTagValueToPythonType, typeValuesList)
- def setIptcTagValue(self, key, value, index=0):
+ def __setIptcTagValue(self, key, value, index=0):
"""
Set the value associated to a key in IPTC metadata.
@@ -450,10 +452,10 @@ class Image(libpyexiv2.Image):
# strings (type 'String') and those that are of type 'Undefined'.
# FIXME: for tags of type 'Undefined', this does not seem to work...
strVal = str(value)
- self.setIptcTag(key, strVal, index)
+ self.__setIptcTag(key, strVal, index)
def __getitem__(self, key):
- print 'Calling __getitem__(...)'
+ #print 'Calling __getitem__(...)'
if key.__class__ is not str:
raise TypeError('Key must be of type string')
tagFamily = key[:4]
@@ -461,14 +463,14 @@ class Image(libpyexiv2.Image):
try:
return self.__exifTagsDict[key]
except KeyError:
- value = self.getExifTagValue(key)
+ value = self.__getExifTagValue(key)
self.__exifTagsDict[key] = value
return value
elif tagFamily == 'Iptc':
try:
return self.__iptcTagsDict[key]
except KeyError:
- value = self.getIptcTagValue(key)
+ value = self.__getIptcTagValue(key)
if len(value) == 1:
value = value[0]
elif len(value) > 1:
@@ -479,16 +481,16 @@ class Image(libpyexiv2.Image):
raise IndexError("'" + key + "': invalid tag identifier")
def __setitem__(self, key, value):
- print 'Calling __setitem__(...)'
+ #print 'Calling __setitem__(...)'
if key.__class__ is not str:
raise TypeError('Key must be of type string')
tagFamily = key[:4]
if tagFamily == 'Exif':
if value is not None:
- self.setExifTagValue(key, value)
+ self.__setExifTagValue(key, value)
self.__exifTagsDict[key] = value
else:
- self.deleteExifTag(key)
+ self.__deleteExifTag(key)
del self.__exifTagsDict[key]
elif tagFamily == 'Iptc':
# The case of IPTC tags is a bit trickier since some tags are
@@ -526,9 +528,9 @@ class Image(libpyexiv2.Image):
# extra items in oldValues are deleted.
for i in xrange(max(len(oldValues), len(newValues))):
try:
- self.setIptcTagValue(key, newValues[i], i)
+ self.__setIptcTagValue(key, newValues[i], i)
except IndexError:
- self.deleteIptcTag(key, min(len(oldValues), len(newValues)))
+ self.__deleteIptcTag(key, min(len(oldValues), len(newValues)))
if len(newValues) > 0:
if len(newValues) == 1:
newValues = newValues[0]
@@ -539,20 +541,20 @@ class Image(libpyexiv2.Image):
raise IndexError("'" + key + "': invalid tag identifier")
def __delitem__(self, key):
- print 'Calling __delitem__(...)'
+ #print 'Calling __delitem__(...)'
if key.__class__ is not str:
raise TypeError('Key must be of type string')
tagFamily = key[:4]
if tagFamily == 'Exif':
- self.deleteExifTag(key)
+ self.__deleteExifTag(key)
del self.__exifTagsDict[key]
elif tagFamily == 'Iptc':
try:
oldValues = self.__iptcTagsDict[key]
except KeyError:
- oldValues = self.getIptcTag(key)
+ oldValues = self.__getIptcTag(key)
for i in xrange(len(oldValues)):
- self.deleteIptcTag(key, 0)
+ self.__deleteIptcTag(key, 0)
del self.__iptcTagsDict[key]
else:
raise IndexError("'" + key + "': invalid tag identifier")
diff --git a/todo b/todo
index 0c30168..1dd119c 100644
--- a/todo
+++ b/todo
@@ -1,6 +1,5 @@
todo list
-- Disable the get...() and set...() methods (by making them private) -> metadata is accessible only through the dictionnary metaphor
- Write methods cacheAllExifTags() and cacheAllIptcTags() that will read and cache all the tag values (to be used in a separate threads, for applications that need to access all the tags anyway)
- Rewrite the exiv2 command-line tool and the test binaries in Python and (Python) scripts to run the same tests that are run to test exiv2
- Rewrite the docstring documentation of the module using epydoc's syntax (http://epydoc.sourceforge.net/manual-fields.html)