[CentralOH] 2017-12-21 道場 Scribbles 落書/惡文? regular expressions; DRY refactoring

jep200404 at columbus.rr.com jep200404 at columbus.rr.com
Tue Dec 26 16:52:34 EST 2017


Full tables tonight

Someone saw:
Mastering Regular Expressions, 3rd Edition By Jeffrey Friedl
at Half-Price Book on Lane Avenue for $22.49
thought the folks at the dojo would be interested,
then remembered that the dojo was going on right then
and went to it, albeit very late

It was gone the next day.

There was some code that included something like the following.
Fun was had refactoring it.

    def __repr__(self):
        s = sorted(self.properties.keys())
        results = []
        for key in s:
            value = self.properties[key]
            if isinstance(value, str):
                results.append('{}: "{}"'.format(key, value))
            else:
                results.append('{}: {}'.format(key, value))

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Iterate over key value pairs.

    def __repr__(self):
        s = sorted(self.properties.items())
        results = []
        for key, value in s:
            if isinstance(value, str):
                results.append('{}: "{}"'.format(key, value))
            else:
                results.append('{}: {}'.format(key, value))

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Get rid of the temporary variable s.

    def __repr__(self):
        results = []
        for key, value in sorted(self.properties.items()):
            if isinstance(value, str):
                results.append('{}: "{}"'.format(key, value))
            else:
                results.append('{}: {}'.format(key, value))

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Use repr() to quote strings, instead of hardcoding '"' for quoting.
repr() correcly quotes strings that have quotes and wierd characters in them.
This changes behavior.

    def __repr__(self):
        results = []
        for key, value in sorted(self.properties.items()):
            if isinstance(value, str):
                results.append('{}: {}'.format(key, repr(value)))
            else:
                results.append('{}: {}'.format(key, value))

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Use repr() for non-strings also.

    def __repr__(self):
        results = []
        for key, value in sorted(self.properties.items()):
            if isinstance(value, str):
                results.append('{}: {}'.format(key, repr(value)))
            else:
                results.append('{}: {}'.format(key, repr(value)))

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Eliminate the superfluous if/else.

    def __repr__(self):
        results = []
        for key, value in sorted(self.properties.items()):
            results.append('{}: {}'.format(key, repr(value)))

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Use !r in format string instead of explicit repr() call.

    def __repr__(self):
        results = []
        for key, value in sorted(self.properties.items()):
            results.append('{}: {!r}'.format(key, value))

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Convert loop to list comprehension.
This was made much easier by eliminating the if/else statements.

    def __repr__(self):
        results = [
            '{}: {!r}'.format(key, value)
            for key, value in sorted(self.properties.items())
        ]

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

A collection (such as a list) is true if it has anything in it,
otherwise it is false. This allows one to test for somethingness
/ emptiness of a collection without using len() as other
languages require.

    def __repr__(self):
        results = [
            '{}: {!r}'.format(key, value)
            for key, value in sorted(self.properties.items())
        ]

        if results:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Rearrange last return statement to be more like next to last
return statement

    def __repr__(self):
        results = [
            '{}: {!r}'.format(key, value)
            for key, value in sorted(self.properties.items())
        ]

        if results:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: {}'.format('empty')

Use "or" operator to eliminate if / else statements.
(Neil's "or" not Neils Bohr)

    def __repr__(self):
        results = [
            '{}: {!r}'.format(key, value)
            for key, value in sorted(self.properties.items())
        ]

        return 'Something: {}'.format(', '.join(results) or 'empty')

Use temporary variable for readability.

    def __repr__(self):
        results = [
            '{}: {!r}'.format(key, value)
            for key, value in sorted(self.properties.items())
        ]
        key_value_pairs_string = ', '.join(results)

        return 'Something: {}'.format(key_value_pairs_string or 'empty')

Use simpler C-style formatting.

    def __repr__(self):
        results = [
            '{}: {!r}'.format(key, value)
            for key, value in sorted(self.properties.items())
        ]
        key_value_pairs_string = ', '.join(results)

        return 'Something: %s' % (key_value_pairs_string or 'empty')

Use simpler C-style formatting again.

    def __repr__(self):
        results = [
            '%s: %r' % (key, value)
            for key, value in sorted(self.properties.items())
        ]
        key_value_pairs_string = ', '.join(results)

        return 'Something: %s' % (key_value_pairs_string or 'empty')

Rename a variable for readability.

    def __repr__(self):
        key_value_strings = [
            '%s: %r' % (key, value)
            for key, value in sorted(self.properties.items())
        ]
        key_value_pairs_string = ', '.join(key_value_strings)

        return 'Something: %s' % (key_value_pairs_string or 'empty')

Make output more robust by using repr() for keys.
This changes behavior.

    def __repr__(self):
        key_value_strings = [
            '%r: %r' % (key, value)
            for key, value in sorted(self.properties.items())
        ]
        key_value_pairs_string = ', '.join(key_value_strings)

        return 'Something: %s' % (key_value_pairs_string or 'empty')

Leave key value pair as a tuple

    def __repr__(self):
        key_value_strings = [
            '%r: %r' % key_value
            for key_value in sorted(self.properties.items())
        ]
        key_value_pairs_string = ', '.join(key_value_strings)

        return 'Something: %s' % (key_value_pairs_string or 'empty')

Compare the above with the original code below.
    no if/else statements
    DRY
Which is easier to understand?
What would you change to make it easier to understand?

    def __repr__(self):
        s = sorted(self.properties.keys())
        results = []
        for key in s:
            value = self.properties[key]
            if isinstance(value, str):
                results.append('{}: "{}"'.format(key, value))
            else:
                results.append('{}: {}'.format(key, value))

        if len(results) > 0:
            return 'Something: {}'.format(', '.join(results))
        else:
            return 'Something: empty'

Does any of the code work?

===============================================================================

link farm

How to add a player to your Python game
https://opensource.com/article/17/12/game-python-add-a-player

Calendar Facts https://xkcd.com/1930/

Using Pygame to move your game character around
https://opensource.com/article/17/12/game-python-moving-player


More information about the CentralOH mailing list