diff --git a/trac/search/templates/search.html b/trac/search/templates/search.html
--- a/trac/search/templates/search.html
+++ b/trac/search/templates/search.html
@@ -30,7 +30,7 @@
         <p class="filters">
           <py:for each="filter in filters">
             <input type="checkbox" id="${filter.name}" name="${filter.name}"
-                   checked="${'checked' if filter.active else None}" />
+                   checked="${filter.active or None}" />
             <label for="${filter.name}">${filter.label}</label>
           </py:for>
        </p>
diff --git a/trac/ticket/notification.py b/trac/ticket/notification.py
--- a/trac/ticket/notification.py
+++ b/trac/ticket/notification.py
@@ -84,7 +84,7 @@ class TicketNotifyEmail(NotifyEmail):
         ambiguous_char_width = env.config.get('notification',
                                               'ambiguous_char_width',
                                               'single')
-        self.ambiwidth = (1, 2)[ambiguous_char_width == 'double']
+        self.ambiwidth = 2 if ambiguous_char_width == 'double' else 1
 
     def notify(self, ticket, newticket=True, modtime=None):
         """Send ticket change notification e-mail (untranslated)"""
diff --git a/trac/ticket/query.py b/trac/ticket/query.py
--- a/trac/ticket/query.py
+++ b/trac/ticket/query.py
@@ -940,7 +940,7 @@ class QueryModule(Component):
                      conversion[1], conversion[4], conversion[0])
 
         if format:
-            filename = ('query', None)[format == 'rss']
+            filename = 'query' if format != 'rss' else None
             Mimeview(self.env).send_converted(req, 'trac.ticket.Query', query,
                                               format, filename=filename)
 
diff --git a/trac/ticket/templates/query.html b/trac/ticket/templates/query.html
--- a/trac/ticket/templates/query.html
+++ b/trac/ticket/templates/query.html
@@ -40,7 +40,7 @@
           <table summary="Query filters">
             <tbody py:for="clause_num, constraints in enumerate(clauses or [{}])"
                    py:with="clause_pre = '%d_' % clause_num">
-              <tr style="${clause_num == 0 and 'display: none' or None}">
+              <tr style="${'display: none' if clause_num == 0 else None}">
                 <td>
                   <div class="trac-clause-lsep">&nbsp;<hr /></div>
                   <div class="trac-clause-msep">Or</div>
@@ -66,16 +66,16 @@
                           <td py:if="field.type not in ('radio', 'checkbox', 'time')" class="mode">
                             <select name="${n_field_name}_mode">
                               <option py:for="mode in modes[field.type]" value="$mode.value"
-                                selected="${mode.value == constraint.mode and 'selected' or None}">$mode.name</option>
+                                      selected="${mode.value == constraint.mode or None}">$mode.name</option>
                             </select>
                           </td>
                         </py:when>
                         <py:otherwise><!--! not the first line of a multiline constraint -->
-                          <th colspan="${field.type == 'time' and 1 or 2}"><label>or</label></th>
+                          <th colspan="${1 if field.type == 'time' else 2}"><label>or</label></th>
                         </py:otherwise>
                       </py:choose>
 
-                      <td class="filter" colspan="${field.type in ('radio', 'checkbox', 'time') and 2 or None}"
+                      <td class="filter" colspan="${2 if field.type in ('radio', 'checkbox', 'time') else None}"
                           py:choose="">
 
                         <py:when test="field.type == 'select'">
@@ -98,8 +98,7 @@
                           <py:for each="option in field.options">
                             <input type="checkbox" id="_${n_field_name}_$option" name="${n_field_name}"
                               value="$option"
-                              checked="${((constraint['mode'] == '') == (option in constraint['values']))
-                                       and 'checked' or None}" />
+                              checked="${((constraint['mode'] == '') == (option in constraint['values'])) or None}" />
                             <label for="_${n_field_name}_$option" class="control">${option or 'none'}</label>
                           </py:for>
                         </py:when>
@@ -172,8 +171,7 @@
             <py:for each="column in all_columns">
               <label>
                 <input type="checkbox" name="col" value="$column"
-                       checked="${any([(value == column) for value in col])
-                                  and 'checked' or None}" />
+                       checked="${any(value == column for value in col) or None}" />
                 ${fields.get(column, {'label': column or 'none'}).label}
               </label>
             </py:for>
@@ -200,7 +198,7 @@
           Show under each result:
           <py:for each="column in all_textareas">
             <label><input type="checkbox" name="row" value="$column"
-                checked="${any([(value == column) for value in row]) and 'checked' or None}" />
+                          checked="${any(value == column for value in row) or None}" />
             ${fields.get(column, {'label': column or 'none'}).label}</label>
           </py:for>
         </p>
@@ -233,13 +231,13 @@
                    value="${_('Edit query')}" />
           </div>
         </form>
-        <form py:if="new or edit" method="get" action="${edit and url_of(report_resource) or href.report()}">
+        <form py:if="new or edit" method="get" action="${url_of(report_resource) if edit else href.report()}">
           <div>
-            <input type="hidden" name="action" value="${edit and 'edit' or 'new'}" />
+            <input type="hidden" name="action" value="${'edit' if edit else 'new'}" />
             <input type="hidden" name="query" value="${query.to_string()}" />
             <input type="submit" value="${_('Save query')}"
-                   title="${edit and _('Save updated query in report {%(id)s}', id=report_resource.id) or
-                                     _('Create new report from current query')}" />
+                   title="${_('Save updated query in report {%(id)s}', id=report_resource.id) if edit
+                            else _('Create new report from current query')}" />
           </div>
         </form>
         <form py:if="delete" method="get" action="${url_of(report_resource)}">
diff --git a/trac/ticket/templates/query_results.html b/trac/ticket/templates/query_results.html
--- a/trac/ticket/templates/query_results.html
+++ b/trac/ticket/templates/query_results.html
@@ -33,15 +33,15 @@
   <py:def function="column_headers()">
     <tr class="trac-columns">
       <th py:for="header in headers"
-          class="$header.name${query.order == header.name and (query.desc and ' desc' or ' asc') or ''}">
+          class="$header.name${(' desc' if query.desc else ' asc') if query.order == header.name else ''}">
         <?python asc = _('(ascending)'); desc = _('(descending)') ?>
         <a title="${_('Sort by %(col)s %(direction)s', col=header.label,
-                      direction=(query.order == header.name and not query.desc and desc or asc))}"
+                      direction=(desc if query.order == header.name and not query.desc else asc))}"
            href="$header.href">${header.label}</a>
       </th>
     </tr>
   </py:def>
-  ${groups and group_heading(*groups[0]) or None}
+  ${group_heading(*groups[0]) if groups else None}
   <table class="listing tickets">
     <thead py:strip="group_index">
       ${column_headers()}
@@ -65,10 +65,10 @@
           <py:with vars="ticket_context = context.child('ticket', result.id)">
             <py:if test="'TICKET_VIEW' in perm(ticket_context.resource)">
 
-              <tr class="${idx % 2 and 'odd' or 'even'} prio${result.priority_value}${
-                'added' in result and ' added' or ''}${
-                'changed' in result and ' changed' or ''}${
-                'removed' in result and ' removed' or ''}">
+              <tr class="${'odd' if idx % 2 else 'even'} prio${result.priority_value}${
+                ' added' if 'added' in result else ''}${
+                ' changed' if 'changed' in result else ''}${
+                ' removed' if 'removed' in result else ''}">
                 <py:for each="idx, header in enumerate(headers)" py:choose="">
                   <py:with vars="name = header.name; value = result[name]">
                     <td py:when="name == 'id'" class="id"><a href="$result.href" title="View ticket"
diff --git a/trac/ticket/templates/report.rss b/trac/ticket/templates/report.rss
--- a/trac/ticket/templates/report.rss
+++ b/trac/ticket/templates/report.rss
@@ -10,7 +10,7 @@
     <image py:if="chrome.logo.src_abs">
       <title>$project.name</title>
       <url>$chrome.logo.src_abs</url>
-      <link>${abs_href.report(report.id != -1 and report.id or '')}</link>
+      <link>${abs_href.report(report.id if report.id != -1 else '')}</link>
     </image>
     <generator>Trac v${trac.version}</generator>
 
diff --git a/trac/ticket/templates/report_edit.html b/trac/ticket/templates/report_edit.html
--- a/trac/ticket/templates/report_edit.html
+++ b/trac/ticket/templates/report_edit.html
@@ -13,7 +13,7 @@
   <body>
     <div id="content" class="report">
 
-      <h1>${action == 'new' and _('New Report') or report.title}</h1>
+      <h1>${_('New Report') if action == 'new' else report.title}</h1>
       <form action="${href.report(report.id)}" method="post" id="edit_report">
         <div>
           <input type="hidden" name="action" value="$action" />
diff --git a/trac/ticket/templates/report_list.html b/trac/ticket/templates/report_list.html
--- a/trac/ticket/templates/report_list.html
+++ b/trac/ticket/templates/report_list.html
@@ -65,10 +65,10 @@
             <span id="trac-sort-order" py:with="report_asc = asc if sort == 'report' else None;
                                                 title_asc = asc if sort == 'title' else None">
               Sort by:
-              <a href="${href.report(sort='report', asc=report_asc and '0' or '1')}"
+              <a href="${href.report(sort='report', asc='0' if report_asc else '1')}"
                  class="${('desc', 'asc')[report_asc] if report_asc is not None else None}">
                 Identifier</a>
-              <a href="${href.report(sort='title', asc=title_asc and '0' or '1')}"
+              <a href="${href.report(sort='title', asc='0' if title_asc else '1')}"
                  class="${('desc', 'asc')[title_asc] if title_asc is not None else None}">
                 Title</a>
             </span>
diff --git a/trac/ticket/templates/report_view.html b/trac/ticket/templates/report_view.html
--- a/trac/ticket/templates/report_view.html
+++ b/trac/ticket/templates/report_view.html
@@ -83,7 +83,7 @@
       <py:def function="column_headers()">
         <tr py:for="header_group in header_groups" class="trac-columns">
           <th py:for="header in header_group" py:if="not header.hidden" py:with="fullrow = header is header_group[-1]"
-              colspan="${fullrow and '100' or None}" class="${header.asc is not None and ('desc', 'asc')[header.asc] or None}">
+              colspan="${'100' if fullrow else None}" class="${('desc', 'asc')[header.asc] if header.asc is not None else None}">
             <a py:strip="not sorting_enabled"
               href="${report_href(sort=header.col, asc=not header.asc)}">
               $header.title
@@ -95,11 +95,11 @@
         <h2 py:if="value_for_group" class="report-result">
           <a py:strip="not row_group or '__grouplink__' not in row_group[0]" href="${row_group[0]['__grouplink__']}">$value_for_group</a>
           <span class="numrows" py:with="cnt = len(row_group)">
-            (${cnt and ngettext('%(num)s match', '%(num)s matches', cnt) or _('No matches found.')})
+            (${ngettext('%(num)s match', '%(num)s matches', cnt) if cnt else _('No matches found.')})
           </span>
         </h2>
       </py:def>
-      ${row_groups and group_heading(*row_groups[0]) or None}
+      ${group_heading(*row_groups[0]) if row_groups else None}
       <table py:if="row_groups" class="listing tickets">
         <py:for each="groupindex, (value_for_group, row_group) in enumerate(row_groups)">
           <thead py:if="not groupindex">
@@ -118,12 +118,12 @@
             <py:for each="row in row_group">
               <tr py:for="cell_group in row.cell_groups"
                 py:with="fullrow = len(cell_group) == 1;
-                         td_attrs = fullrow and {'class': 'fullrow', 'colspan': 100} or {}"
-                class="${'__color__' in row and 'color'+row.__color__+'-' or ''}${row.__idx__ % 2 and 'odd' or 'even'}"
-                style="${'__bgcolor__' in row and 'background: '+row.__bgcolor__+';' or None
-                }${'__fgcolor__' in row and 'color: '+row.__fgcolor__+';' or None
-                }${'__style__' in row and row.__style__+';' or None
-                }${fullrow and 'border: none; padding: 0;' or None}">
+                         td_attrs = {'class': 'fullrow', 'colspan': 100} if fullrow else {}"
+                class="${'color' + row.__color__ + '-' if '__color__' in row else ''}${'odd' if row.__idx__ % 2 else 'even'}"
+                style="${'background: ' + row.__bgcolor__ + ';' if '__bgcolor__' in row else None
+                }${'color: ' + row.__fgcolor__ + ';' if '__fgcolor__' in row else None
+                }${row.__style__ + ';' if '__style__' in row else None
+                }${'border: none; padding: 0;' if fullrow else None}">
 
                 <py:for each="cell in cell_group">
                   <py:if test="not cell.header.hidden">
@@ -155,19 +155,19 @@
 
                         <!--! generic fields -->
                         <py:when test="col == 'time'">
-                          <td class="date" py:attrs="td_attrs">${cell.value != '' and format_time(from_utimestamp(long(cell.value))) or '--'}
+                          <td class="date" py:attrs="td_attrs">${format_time(from_utimestamp(long(cell.value))) if cell.value != '' else '--'}
                             <hr py:if="fullrow"/>
                           </td>
                         </py:when>
 
                         <py:when test="col in ('date', 'created', 'modified')">
-                          <td class="date" py:attrs="td_attrs">${cell.value != '' and format_date(from_utimestamp(long(cell.value))) or '--'}
+                          <td class="date" py:attrs="td_attrs">${format_date(from_utimestamp(long(cell.value))) if cell.value != '' else '--'}
                             <hr py:if="fullrow"/>
                           </td>
                         </py:when>
 
                         <py:when test="col == 'datetime'">
-                          <td class="date" py:attrs="td_attrs">${cell.value != '' and format_datetime(from_utimestamp(long(cell.value))) or '--'}
+                          <td class="date" py:attrs="td_attrs">${format_datetime(from_utimestamp(long(cell.value))) if cell.value != '' else '--'}
                             <hr py:if="fullrow"/>
                           </td>
                         </py:when>
diff --git a/trac/ticket/templates/ticket.html b/trac/ticket/templates/ticket.html
--- a/trac/ticket/templates/ticket.html
+++ b/trac/ticket/templates/ticket.html
@@ -127,8 +127,8 @@
                              show_editor = can_edit_comment and str(change.cnum) == cnum_edit;
                              show_history = str(change.cnum) == cnum_hist;
                              max_version = max(change.comment_history);
-                             comment_version = (max_version, int(cversion or 0))[show_history]">
-              <div class="change" id="${'cnum' in change and 'trac-change-%d' % change.cnum or None}">
+                             comment_version = int(cversion or 0) if show_history else max_version">
+              <div class="change" id="${'trac-change-%d' % change.cnum if 'cnum' in change else None}">
                 <h3 class="change">
                   <span class="threading" py:if="'cnum' in change"
                         py:with="change_replies = replies.get(str(change.cnum), [])">
@@ -167,7 +167,7 @@
                 </py:if>
                 <xi:include href="ticket_change.html"/>
                 <div py:if="not show_editor and len(change.comment_history) > 1" py:choose=""
-                     class="trac-lastedit ${comment_version != max_version and 'trac-shade' or None}">
+                     class="trac-lastedit ${'trac-shade' if comment_version != max_version else None}">
                   <i18n:msg params="version, date, author" py:when="comment_version != max_version">
                       Version ${comment_version}, edited ${dateinfo(change.comment_history[comment_version].date)} ago
                       by ${authorinfo(change.comment_history[comment_version].author)}
@@ -197,7 +197,7 @@
       <!--! End of the section we don't show on initial new tickets -->
 
       <form py:if="has_property_editor" method="post" id="propertyform"
-            action="${ticket.exists and href.ticket(ticket.id) + '#trac-add-comment' or href.newticket()}">
+            action="${href.ticket(ticket.id) + '#trac-add-comment' if ticket.exists else href.newticket()}">
         <!--! Add comment -->
         <div py:if="ticket.exists and can_append" class="field"
              py:with="show_comment_preview = (change_preview.fields or change_preview.comment) and cnum_edit is None">
@@ -221,8 +221,8 @@
             may have failed.
           </div>
           <!--! Preview of ticket changes -->
-          <div id="ticketchange" class="ticketdraft" style="${not show_comment_preview and 'display: none' or None}">
-            <h3 class="change" id="${'cnum' in change_preview and 'comment:%d' % change_preview.cnum or None}">
+          <div id="ticketchange" class="ticketdraft" style="${'display: none' if not show_comment_preview else None}">
+            <h3 class="change" id="${'comment:%d' % change_preview.cnum if 'cnum' in change_preview else None}">
               <span class="threading" py:if="'replyto' in change_preview">
                 in reply to: ${commentref('&uarr;&nbsp;', change_preview.replyto)}
               </span>
@@ -285,7 +285,7 @@
                         field.edit_label or field.label or field.name}:</label>
                     </th>
                     <td class="col${idx + 1}" py:if="idx == 0 or not fullrow"
-                        colspan="${fullrow and 3 or None}">
+                        colspan="${3 if fullrow else None}">
                       <py:choose test="field.type" py:if="field">
                         <select py:when="'select'" id="field-${field.name}" name="field_${field.name}">
                           <option py:if="field.optional"></option>
@@ -302,11 +302,11 @@
                         </select>
                         <textarea py:when="'textarea'" id="field-${field.name}" name="field_${field.name}"
                                   cols="${field.width}" rows="${field.height}"
-                                  class="${field.format == 'wiki' and 'wikitext ' or None}trac-resizable">
+                                  class="${'wikitext ' if field.format == 'wiki' else None}trac-resizable">
 ${value}</textarea>
                         <span py:when="'checkbox'">
                           <input type="checkbox" id="field-${field.name}" name="field_${field.name}"
-                                 checked="${value == '1' and 'checked' or None}" value="1" />
+                                 checked="${value == '1' or None}" value="1" />
                           <input type="hidden" name="field_checkbox_${field.name}" value="1" />
                         </span>
                         <label py:when="'radio'"
@@ -404,7 +404,7 @@
             <input type="hidden" name="cnum" value="${cnum}" />
           </py:if>
           <input type="submit" name="preview" value="${_('Preview')}" accesskey="r" />&nbsp;
-          <input type="submit" name="submit" value="${ticket.exists and _('Submit changes') or _('Create ticket')}" />
+          <input type="submit" name="submit" value="${_('Submit changes') if ticket.exists else _('Create ticket')}" />
         </div>
 
       </form>
diff --git a/trac/ticket/templates/ticket_box.html b/trac/ticket/templates/ticket_box.html
--- a/trac/ticket/templates/ticket_box.html
+++ b/trac/ticket/templates/ticket_box.html
@@ -14,7 +14,7 @@ Arguments:
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude"
      xmlns:i18n="http://genshi.edgewall.org/i18n"
-     id="ticket" class="${preview_mode and 'ticketdraft' or None}">
+     id="ticket" class="${'ticketdraft' if preview_mode else None}">
   <div class="date">
     <p i18n:msg="created" py:if="ticket.exists">Opened ${dateinfo(ticket.time)} ago</p>
     <p i18n:msg="modified" py:if="ticket.changetime != ticket.time">Last modified ${dateinfo(ticket.changetime)} ago</p>
@@ -28,24 +28,24 @@ Arguments:
     <tr>
       <th id="h_reporter">Reported by:</th>
       <td headers="h_reporter" class="searchable">
-        ${defined('reporter_link') and reporter_link or authorinfo(ticket.reporter)}
+        ${reporter_link if defined('reporter_link') else authorinfo(ticket.reporter)}
       </td>
       <th id="h_owner">Owned by:</th>
       <td headers="h_owner">
-        ${ticket.owner and (defined('owner_link') and owner_link or authorinfo(ticket.owner)) or ''}
+        ${(owner_link if defined('owner_link') else authorinfo(ticket.owner)) if ticket.owner else ''}
       </td>
     </tr>
     <tr py:for="row in group(fields, 2, lambda f: f.type != 'textarea')"
       py:with="fullrow = len(row) == 1">
       <py:for each="idx, field in enumerate(row)">
         <th py:if="idx == 0 or not fullrow"
-            id="${field and 'h_' + field.name or None}">
+            id="${'h_' + field.name if field else None}">
           <py:if test="field"><i18n:msg params="field">${field.label or field.name}:</i18n:msg></py:if>
         </th>
         <td py:if="idx == 0 or not fullrow"
-            headers="${field and 'h_' + field.name or None}"
-            class="${field and field.name in ('cc', 'keywords') and 'searchable' or None}"
-            colspan="${fullrow and 3 or None}">
+            headers="${'h_' + field.name if field else None}"
+            class="${'searchable' if field and field.name in ('cc', 'keywords') else None}"
+            colspan="${3 if fullrow else None}">
           <py:if test="field">
             <py:choose test="">
               <py:when test="'rendered' in field">${field.rendered}</py:when>
diff --git a/trac/ticket/templates/ticket_change.html b/trac/ticket/templates/ticket_change.html
--- a/trac/ticket/templates/ticket_change.html
+++ b/trac/ticket/templates/ticket_change.html
@@ -38,7 +38,7 @@ Arguments:
   <form py:if="show_editor" id="trac-comment-editor" method="post" action="#comment:${change.cnum}">
     <div>
       <textarea name="edited_comment" class="wikitext trac-resizable" rows="10" cols="78">
-${(edited_comment, change.comment)[edited_comment is None]}</textarea>
+${edited_comment if edited_comment is not None else change.comment}</textarea>
       <input type="hidden" name="cnum_edit" value="${change.cnum}"/>
     </div>
     <div class="buttons">
@@ -51,8 +51,9 @@ Arguments:
     </div>
   </form>
   <py:choose>
-    <div py:when="str(change.cnum) == cnum_edit" py:with="text = (edited_comment, change.comment)[edited_comment is None]"
-         class="comment searchable ticketdraft" style="${not text and 'display: none' or None}" xml:space="preserve">
+    <div py:when="str(change.cnum) == cnum_edit"
+         py:with="text = edited_comment if edited_comment is not None else change.comment"
+         class="comment searchable ticketdraft" style="${'display: none' if not text else None}" xml:space="preserve">
       ${wiki_to_html(context, text, escape_newlines=preserve_newlines)}
     </div>
     <div py:otherwise="" py:choose="" class="comment searchable" xml:space="preserve">
diff --git a/trac/ticket/templates/ticket_notify_email.txt b/trac/ticket/templates/ticket_notify_email.txt
--- a/trac/ticket/templates/ticket_notify_email.txt
+++ b/trac/ticket/templates/ticket_notify_email.txt
@@ -19,7 +19,7 @@
 {%     end %}\
 {%     if change.comment %}\
 
-${changes_body and _('Comment:') or _('Comment (by %(author)s):', author=change.author)}
+${_('Comment:') if changes_body else _('Comment (by %(author)s):', author=change.author)}
 
 $change.comment
 {%     end %}\
diff --git a/trac/ticket/tests/notification.py b/trac/ticket/tests/notification.py
--- a/trac/ticket/tests/notification.py
+++ b/trac/ticket/tests/notification.py
@@ -176,7 +176,7 @@ class NotificationTestCase(unittest.Test
         def run_bcc_feature(public):
             # CC list should be private
             self.env.config.set('notification', 'use_public_cc',
-                                public and 'true' or 'false')
+                                'true' if public else 'false')
             self.env.config.set('notification', 'smtp_always_bcc', 
                                 'joe.foobar@example.net')
             ticket = Ticket(self.env)
diff --git a/trac/ticket/web_ui.py b/trac/ticket/web_ui.py
--- a/trac/ticket/web_ui.py
+++ b/trac/ticket/web_ui.py
@@ -576,7 +576,7 @@ class TicketModule(Component):
         format = req.args.get('format')
         if format:
             # FIXME: mime.send_converted(context, ticket, 'ticket_x') (#3332)
-            filename = ('t%d' % ticket.id, None)[format == 'rss']
+            filename = 't%d' % ticket.id if format != 'rss' else None
             mime.send_converted(req, 'trac.ticket.Ticket', ticket,
                                 format, filename=filename)
 
@@ -848,9 +848,9 @@ class TicketModule(Component):
 
         for field in text_fields:
             old_text = old_ticket.get(field)
-            old_text = old_text and old_text.splitlines() or []
+            old_text = old_text.splitlines() if old_text else []
             new_text = new_ticket.get(field)
-            new_text = new_text and new_text.splitlines() or []
+            new_text = new_text.splitlines() if new_text else []
             diffs = diff_blocks(old_text, new_text, context=diff_context,
                                 ignore_blank_lines='-B' in diff_options,
                                 ignore_case='-i' in diff_options,
@@ -894,7 +894,7 @@ class TicketModule(Component):
 
     def _make_comment_url(self, req, ticket, cnum, version=None):
         return req.href.ticket(ticket.id,
-                               cnum_hist=version is not None and cnum or None,
+                               cnum_hist=cnum if version is not None else None,
                                cversion=version) + '#comment:%d' % cnum
 
     def _get_comment_history(self, req, ticket, cnum):
@@ -902,7 +902,7 @@ class TicketModule(Component):
         for version, date, author, comment in ticket.get_comment_history(cnum):
             history.append({
                 'version': version, 'date': date, 'author': author,
-                'comment': version == 0 and _("''Initial version''") or '',
+                'comment': _("''Initial version''") if version == 0 else '',
                 'value': comment,
                 'url': self._make_comment_url(req, ticket, cnum, version)
             })
@@ -962,7 +962,7 @@ class TicketModule(Component):
         def get_text(version):
             try:
                 text = history[version]['value']
-                return text and text.splitlines() or []
+                return text.splitlines() if text else []
             except KeyError:
                 raise ResourceNotFound(_("No version %(version)d for comment "
                                          "%(cnum)d on ticket #%(ticket)s",
@@ -1243,7 +1243,7 @@ class TicketModule(Component):
         if ticket.save_changes(get_reporter_id(req, 'author'),
                                      req.args.get('comment'), when=now,
                                      cnum=internal_cnum):
-            fragment = cnum and '#comment:' + cnum or ''
+            fragment = '#comment:' + cnum if cnum else ''
             try:
                 tn = TicketNotifyEmail(self.env)
                 tn.notify(ticket, newticket=False, modtime=now)
@@ -1420,7 +1420,7 @@ class TicketModule(Component):
                 value = ticket.values.get(name)
                 if value in ('1', '0'):
                     field['rendered'] = self._query_link(req, name, value,
-                                value == '1' and _("yes") or _("no"))
+                                _("yes") if value == '1' else _("no"))
             elif type_ == 'text':
                 if field.get('format') == 'wiki':
                     field['rendered'] = format_to_oneliner(self.env, context,
@@ -1606,7 +1606,7 @@ class TicketModule(Component):
                 type_ = f['type']
                 break
         if type_ == 'checkbox':
-            rendered = new == '1' and _("set") or _("unset")
+            rendered = _("set") if new == '1' else _("unset")
         elif type_ == 'textarea':
             if not resource_new:
                 rendered = _("modified")
@@ -1667,7 +1667,7 @@ class TicketModule(Component):
         autonum = 0 # used for "root" numbers
         last_uid = current = None
         for date, author, field, old, new, permanent in changelog:
-            uid = permanent and (date,) or (date, author)
+            uid = (date,) if permanent else (date, author)
             if uid != last_uid:
                 if current:
                     last_comment = comment_history[max(comment_history)]
diff --git a/trac/timeline/templates/timeline.html b/trac/timeline/templates/timeline.html
--- a/trac/timeline/templates/timeline.html
+++ b/trac/timeline/templates/timeline.html
@@ -33,9 +33,9 @@
       </form>
 
       <py:for each="day, events in groupby(events, key=lambda e: format_date(e.date))">
-        <h2>${day}: ${day == today and _("Today") or day == yesterday and _("Yesterday") or None}</h2>
+        <h2>${day}: ${_("Today") if day == today else _("Yesterday") if day == yesterday else None}</h2>
         <dl py:for="unread, events in groupby(events, key=lambda e: lastvisit and lastvisit &lt; e.dateuid)"
-            class="${unread and 'unread' or None}">
+            class="${'unread' if unread else None}">
           <py:for each="event in events"
             py:with="highlight = precision and precisedate and timedelta(0) &lt;= (event.date - precisedate) &lt; precision">
             <dt class="${classes(event.kind, highlight=highlight, unread=unread)}">
diff --git a/trac/timeline/web_ui.py b/trac/timeline/web_ui.py
--- a/trac/timeline/web_ui.py
+++ b/trac/timeline/web_ui.py
@@ -90,7 +90,7 @@ class TimelineModule(Component):
         req.perm.assert_permission('TIMELINE_VIEW')
 
         format = req.args.get('format')
-        maxrows = int(req.args.get('max', format == 'rss' and 50 or 0))
+        maxrows = int(req.args.get('max', 50 if format == 'rss' else 0))
         lastvisit = int(req.session.get('timeline.lastvisit', '0'))
 
         # indication of new events is unchanged when form is updated by user
@@ -123,7 +123,7 @@ class TimelineModule(Component):
                                     microsecond=999999)
 
         daysback = as_int(req.args.get('daysback'),
-                          format == 'rss' and 90 or None)
+                          90 if format == 'rss' else None)
         if daysback is None:
             daysback = as_int(req.session.get('timeline.daysback'), None)
         if daysback is None:
@@ -188,7 +188,7 @@ class TimelineModule(Component):
                 for event in provider.get_timeline_events(req, start, stop,
                                                           filters) or []:
                     # Check for 0.10 events
-                    author = (event[len(event) < 6 and 2 or 4] or '').lower()
+                    author = (event[2 if len(event) < 6 else 4] or '').lower()
                     if (not include or author in include) \
                        and not author in exclude:
                         events.append(self._event_data(provider, event))
diff --git a/trac/util/__init__.py b/trac/util/__init__.py
--- a/trac/util/__init__.py
+++ b/trac/util/__init__.py
@@ -496,7 +496,7 @@ def get_doc(obj):
         return (None, None)
     doc = to_unicode(doc).split('\n\n', 1)
     summary = doc[0].replace('\n', ' ')
-    description = len(doc) > 1 and doc[1] or None
+    description = doc[1] if len(doc) > 1 else None
     return (summary, description)
 
 # -- setuptools utils
diff --git a/trac/util/datefmt.py b/trac/util/datefmt.py
--- a/trac/util/datefmt.py
+++ b/trac/util/datefmt.py
@@ -308,7 +308,7 @@ def _parse_date_iso8601(text, tzinfo):
                 if tz == 0:
                     tzinfo = utc
                 else:
-                    tzinfo = FixedOffset(tzsign == '-' and -tz or tz,
+                    tzinfo = FixedOffset(-tz if tzsign == '-' else tz,
                                          '%s%s:%s' %
                                          (tzsign, tzhours, tzminutes))
             tm = time.strptime('%s ' * 6 % (years, months, days,
diff --git a/trac/util/text.py b/trac/util/text.py
--- a/trac/util/text.py
+++ b/trac/util/text.py
@@ -203,8 +203,8 @@ def text_width(text, ambiwidth=1):
 
     cf. http://www.unicode.org/reports/tr11/.
     """
-    twice = ('FW', 'FWA')[ambiwidth == 2]
-    return sum([(1, 2)[east_asian_width(chr) in twice]
+    twice = 'FWA' if ambiwidth == 2 else 'FW'
+    return sum([2 if east_asian_width(chr) in twice else 1
                 for chr in to_unicode(text)])
 
 def print_table(data, headers=None, sep='  ', out=None):
@@ -419,7 +419,7 @@ def obfuscate_email_address(address):
         at = address.find('@')
         if at != -1:
             return address[:at] + u'@\u2026' + \
-                   (address[-1] == '>' and '>' or '')
+                   ('>' if address[-1] == '>' else '')
     return address
 
 def breakable_path(path):
diff --git a/trac/util/translation.py b/trac/util/translation.py
--- a/trac/util/translation.py
+++ b/trac/util/translation.py
@@ -11,10 +11,10 @@
 # individuals. For the exact contribution history, see the revision
 # history and logs, available at http://trac.edgewall.org/log/.
 
+"""Utilities for text translation with gettext."""
+
 from __future__ import with_statement
 
-"""Utilities for text translation with gettext."""
-
 import pkg_resources
 import re
 
@@ -44,7 +44,7 @@ def dgettext_noop(domain, string, **kwar
 N_ = _noop = lambda string: string
 
 def ngettext_noop(singular, plural, num, **kwargs):
-    string = (plural, singular)[num == 1]
+    string = singular if num == 1 else plural
     kwargs.setdefault('num', num)
     return safefmt(string, kwargs)
 
@@ -59,13 +59,13 @@ def _tag_kwargs(trans, kwargs):
     return tag(*trans_elts)
 
 def tgettext_noop(string, **kwargs):
-    return kwargs and _tag_kwargs(string, kwargs) or string
+    return _tag_kwargs(string, kwargs) if kwargs else string
 
 def dtgettext_noop(domain, string, **kwargs):
     return tgettext_noop(string, **kwargs)
 
 def tngettext_noop(singular, plural, num, **kwargs):
-    string = (plural, singular)[num == 1]
+    string = singular if num == 1 else plural
     kwargs.setdefault('num', num)
     return _tag_kwargs(string, kwargs)
 
@@ -221,7 +221,7 @@ try:
         def tgettext(self, string, **kwargs):
             def _tgettext():
                 trans = self.active.ugettext(string)
-                return kwargs and _tag_kwargs(trans, kwargs) or trans
+                return _tag_kwargs(trans, kwargs) if kwargs else trans
             if not self.isactive:
                 return LazyProxy(_tgettext)
             return _tgettext()
@@ -229,7 +229,7 @@ try:
         def dtgettext(self, domain, string, **kwargs):
             def _dtgettext():
                 trans = self.active.dugettext(domain, string)
-                return kwargs and _tag_kwargs(trans, kwargs) or trans
+                return _tag_kwargs(trans, kwargs) if kwargs else trans
             if not self.isactive:
                 return LazyProxy(_dtgettext)
             return _dtgettext()
@@ -250,7 +250,7 @@ try:
                 trans = self.active.dungettext(domain, singular, plural, num)
                 if '%(num)' in trans:
                     kwargs.update(num=num)
-                return kwargs and _tag_kwargs(trans, kwargs) or trans
+                return _tag_kwargs(trans, kwargs) if kwargs else trans
             if not self.isactive:
                 return LazyProxy(_dtngettext)
             return _dtngettext()
diff --git a/trac/versioncontrol/admin.py b/trac/versioncontrol/admin.py
--- a/trac/versioncontrol/admin.py
+++ b/trac/versioncontrol/admin.py
@@ -189,7 +189,7 @@ class RepositoryAdminPanel(Component):
         
         if path_info:
             # Detail view
-            reponame = not is_default(path_info) and path_info or ''
+            reponame = path_info if not is_default(path_info) else ''
             info = all_repos.get(reponame)
             if info is None:
                 raise TracError(_("Repository '%(repo)s' not found",
diff --git a/trac/versioncontrol/api.py b/trac/versioncontrol/api.py
--- a/trac/versioncontrol/api.py
+++ b/trac/versioncontrol/api.py
@@ -386,7 +386,7 @@ class RepositoryManager(Component):
                 kind = _("path")
                 if resource.version:
                     version = '@%s' % resource.version
-            in_repo = reponame and _(" in %(repo)s", repo=reponame) or ''
+            in_repo = _(" in %(repo)s", repo=reponame) if reponame else ''
             # TRANSLATOR: file /path/to/file.py at version 13 in reponame
             return _('%(kind)s %(id)s%(at_version)s%(in_repo)s',
                      kind=kind, id=id, at_version=version, in_repo=in_repo)
@@ -551,7 +551,7 @@ class RepositoryManager(Component):
                  been truncated, if needed.
         """
         matches = []
-        path = path and path.strip('/') + '/' or '/'
+        path = path.strip('/') + '/' if path else '/'
         for reponame in self.get_all_repositories().keys():
             stripped_reponame = reponame.strip('/') + '/'
             if path.startswith(stripped_reponame):
@@ -1061,7 +1061,7 @@ class Node(object):
 
     def is_viewable(self, perm):
         """Return True if view permission is granted on the node."""
-        return (self.isdir and 'BROWSER_VIEW' or 'FILE_VIEW') \
+        return ('BROWSER_VIEW' if self.isdir else 'FILE_VIEW') \
                in perm(self.resource)
 
     can_view = is_viewable  # 0.12 compatibility
diff --git a/trac/versioncontrol/cache.py b/trac/versioncontrol/cache.py
--- a/trac/versioncontrol/cache.py
+++ b/trac/versioncontrol/cache.py
@@ -346,7 +346,7 @@ class CachedRepository(Repository):
                 for i in range(1, len(components) + 1):
                     args.append('/'.join(components[:i]))
 
-            sql += " ORDER BY rev" + (direction == '<' and " DESC" or "") \
+            sql += " ORDER BY rev" + (" DESC" if direction == '<' else "") \
                    + " LIMIT 1"
             
             for rev, in db(sql, args):
diff --git a/trac/versioncontrol/diff.py b/trac/versioncontrol/diff.py
--- a/trac/versioncontrol/diff.py
+++ b/trac/versioncontrol/diff.py
@@ -331,7 +331,7 @@ def get_diff_options(req):
     
     arg = int(req.args.get('contextall', 0))
     options_data['contextall'] = arg
-    options = ['-U%d' % (arg and -1 or context)]
+    options = ['-U%d' % (-1 if arg else context)]
 
     arg = get_bool_option('ignoreblanklines')
     if arg:
diff --git a/trac/versioncontrol/svn_authz.py b/trac/versioncontrol/svn_authz.py
--- a/trac/versioncontrol/svn_authz.py
+++ b/trac/versioncontrol/svn_authz.py
@@ -83,7 +83,7 @@ def parse(authz, modules):
             aliases[name] = value.strip()
         else:
             parts = section.split(':', 1)
-            module, path = len(parts) > 1 and parts[0] or '', parts[-1]
+            module, path = parts[0] if len(parts) > 1 else '', parts[-1]
             if module in modules:
                 sections.setdefault((module, path), []).append((name, value))
 
@@ -149,7 +149,7 @@ class AuthzSourcePolicy(Component):
     # IPermissionPolicy methods
 
     def check_permission(self, action, username, resource, perm):
-        realm = resource and resource.realm or None
+        realm = resource.realm if resource else None
         if (realm, action) in self._handled_perms:
             authz, users = self._get_authz_info()
             if authz is None:
@@ -160,7 +160,7 @@ class AuthzSourcePolicy(Component):
             else:
                 usernames = (username, '$authenticated', '*')
             if resource is None:
-                return users & set(usernames) and True or None
+                return True if users & set(usernames) else None
 
             rm = RepositoryManager(self.env)
             try:
diff --git a/trac/versioncontrol/svn_fs.py b/trac/versioncontrol/svn_fs.py
--- a/trac/versioncontrol/svn_fs.py
+++ b/trac/versioncontrol/svn_fs.py
@@ -117,7 +117,7 @@ def _is_path_within_scope(scope, fullpat
     """Check whether the given `fullpath` is within the given `scope`"""
     if scope == '/':
         return fullpath is not None
-    fullpath = fullpath and fullpath.lstrip('/') or ''
+    fullpath = fullpath.lstrip('/') if fullpath else ''
     scope = scope.strip('/')
     return (fullpath + '/').startswith(scope + '/')
 
@@ -360,7 +360,7 @@ class SubversionRepository(Repository):
             self.scope = '/'
         assert self.scope[0] == '/'
         # we keep root_path_utf8 for  RA 
-        ra_prefix = os.name == 'nt' and 'file:///' or 'file://'
+        ra_prefix = 'file:///' if os.name == 'nt' else 'file://'
         self.ra_url_utf8 = ra_prefix + root_path_utf8
         self.clear()
 
diff --git a/trac/versioncontrol/svn_prop.py b/trac/versioncontrol/svn_prop.py
--- a/trac/versioncontrol/svn_prop.py
+++ b/trac/versioncontrol/svn_prop.py
@@ -79,8 +79,8 @@ class SubversionPropertyRenderer(Compone
     def match_property(self, name, mode):
         if name in ('svn:externals', 'svn:needs-lock'):
             return 4
-        return name in ('svn:mergeinfo', 'svnmerge-blocked',
-                        'svnmerge-integrated') and 2 or 0
+        return 2 if name in ('svn:mergeinfo', 'svnmerge-blocked',
+                             'svnmerge-integrated') else 0
     
     def render_property(self, name, mode, context, props):
         if name == 'svn:externals':
@@ -124,7 +124,7 @@ class SubversionPropertyRenderer(Compone
                 base_url, pref = posixpath.split(base_url)
                 prefix.append(pref)
             href = self._externals_map.get(base_url)
-            revstr = rev and ' at revision '+rev or ''
+            revstr = ' at revision ' + rev if rev else ''
             if not href and (url.startswith('http://') or 
                              url.startswith('https://')):
                 href = url.replace('%', '%%')
@@ -175,8 +175,8 @@ class SubversionMergePropertyRenderer(Co
     # IPropertyRenderer methods
 
     def match_property(self, name, mode):
-        return name in ('svn:mergeinfo', 'svnmerge-blocked',
-                        'svnmerge-integrated') and 4 or 0
+        return 4 if name in ('svn:mergeinfo', 'svnmerge-blocked',
+                             'svnmerge-integrated') else 0
     
     def render_property(self, name, mode, context, props):
         """Parse svn:mergeinfo and svnmerge-* properties, converting branch
@@ -184,8 +184,8 @@ class SubversionMergePropertyRenderer(Co
         and eligible revisions.
         """
         has_eligible = name in ('svnmerge-integrated', 'svn:mergeinfo')
-        revs_label = (_('merged'), _('blocked'))[name.endswith('blocked')]
-        revs_cols = has_eligible and 2 or None
+        revs_label = _('blocked') if name.endswith('blocked') else _('merged')
+        revs_cols = 2 if has_eligible else None
         reponame = context.resource.parent.id
         target_path = context.resource.id
         repos = RepositoryManager(self.env).get_repository(reponame)
@@ -249,12 +249,12 @@ class SubversionMergePropertyRenderer(Co
         if not rows:
             return None
         rows.sort()
-        has_deleted = rows and rows[-1][0] or None
+        has_deleted = rows[-1][0] if rows else None
         return tag(has_deleted and tag.a(_('(toggle deleted branches)'),
                                          class_='trac-toggledeleted',
                                          href='#'),
                    tag.table(tag.tbody(
-                       [tag.tr(row, class_=deleted and 'trac-deleted' or None)
+                       [tag.tr(row, class_='trac-deleted' if deleted else None)
                         for deleted, spath, row in rows]), class_='props'))
 
 
@@ -318,8 +318,8 @@ class SubversionMergePropertyDiffRendere
     # IPropertyDiffRenderer methods
 
     def match_property_diff(self, name):
-        return name in ('svn:mergeinfo', 'svnmerge-blocked',
-                        'svnmerge-integrated') and 4 or 0
+        return 4 if name in ('svn:mergeinfo', 'svnmerge-blocked',
+                             'svnmerge-integrated') else 0
 
     def render_property_diff(self, name, old_context, old_props,
                              new_context, new_props, options):
diff --git a/trac/versioncontrol/templates/admin_repositories.html b/trac/versioncontrol/templates/admin_repositories.html
--- a/trac/versioncontrol/templates/admin_repositories.html
+++ b/trac/versioncontrol/templates/admin_repositories.html
@@ -131,7 +131,7 @@
                 <td class="name">
                   <a href="${panel_href(info.name or '(default)')}">${info.name or _('(default)')}</a>
                 </td>
-                <td>${not info.alias and (info.type or _('(default)')) or None}</td>
+                <td>${(info.type or _('(default)')) if not info.alias else None}</td>
                 <td py:choose="">
                   <py:when test="info.dir">$info.prettydir</py:when>
                   <em py:otherwise="" i18n:msg="repo">Alias of ${info.alias or _('(default)')}</em>
diff --git a/trac/versioncontrol/templates/browser.html b/trac/versioncontrol/templates/browser.html
--- a/trac/versioncontrol/templates/browser.html
+++ b/trac/versioncontrol/templates/browser.html
@@ -73,7 +73,7 @@
         <div id="jumprev">
           <form action="" method="get">
             <div>
-              <label for="rev" title="${stickyrev and _('Hint: clear the field to view latest revision') or None}">
+              <label for="rev" title="${_('Hint: clear the field to view latest revision') if stickyrev else None}">
                 View revision:</label>
               <input type="text" id="rev" name="rev" value="$stickyrev" size="6" />
             </div>
diff --git a/trac/versioncontrol/templates/changeset.html b/trac/versioncontrol/templates/changeset.html
--- a/trac/versioncontrol/templates/changeset.html
+++ b/trac/versioncontrol/templates/changeset.html
@@ -78,7 +78,7 @@
 
       <form py:if="not xhr and (has_diffs or diff.options.ignoreblanklines or diff.options.ignorecase or
                                 diff.options.ignorewhitespace)"
-        id="prefs" action="">
+            id="prefs" action="">
         <div>
           <py:if test="not changeset">
             <input type="hidden" name="old_path" value="${'/' + pathjoin(reponame, old_path)}" />
@@ -91,15 +91,15 @@
       </form>
 
       <py:def function="node_change(idx,item,cl,kind)">
-        <py:with vars="ndiffs = item.diffs is not None and len(item.diffs) or 0;
+        <py:with vars="ndiffs = len(item.diffs) if item.diffs is not None else 0;
                        nprops = len(item.props);
                        is_removal = cl == 'rem';
-                       path = is_removal and item.old.get('path') or item.new.get('path');
+                       path = item.old.get('path') if is_removal else item.new.get('path');
                        path = path and path[len(location):].strip('/')">
           <div class="$cl"> </div>
           <py:choose>
-          <a py:when="is_removal" href="$item.old.href"
-             title="${_('Show what was removed (content at revision %(old_rev)s)', old_rev=display_rev(item.old.rev))}">
+            <a py:when="is_removal" href="$item.old.href"
+               title="${_('Show what was removed (content at revision %(old_rev)s)', old_rev=display_rev(item.old.rev))}">
               $path
             </a>
             <a py:otherwise="" title="Show entry in browser" href="$item.new.href">
@@ -120,9 +120,9 @@
             </py:when>
             <py:when test="ndiffs + nprops &gt; 0">
               (<a title="Show differences" href="#file$idx">${
-                 ndiffs and ngettext('%(num)d diff', '%(num)d diffs', ndiffs) or None}${
-                 (ndiffs and nprops) and ', ' or ''
-                }${nprops and ngettext('%(num)d prop', '%(num)d props', nprops) or None}</a>)
+                 ngettext('%(num)d diff', '%(num)d diffs', ndiffs) if ndiffs else None}${
+                 ', ' if ndiffs and nprops else None
+                }${ngettext('%(num)d prop', '%(num)d props', nprops) if nprops else None}</a>)
             </py:when>
           </py:choose>
           <py:if test="cl == 'mod' and item.diffs is None">
@@ -167,7 +167,7 @@
           <dd class="searchable"><a href="${href.browser(reponame, location, rev=new_rev)}">$location</a></dd>
         </py:if>
         <dt class="property files">
-          ${files and ngettext('File:', 'Files:', num=len(files)) or _('(No files)')}
+          ${ngettext('File:', 'Files:', num=len(files)) if files else _('(No files)')}
         </dt>
         <dd class="files">
           <div class="legend" id="file-legend" py:if="filestats">
diff --git a/trac/versioncontrol/templates/dir_entries.html b/trac/versioncontrol/templates/dir_entries.html
--- a/trac/versioncontrol/templates/dir_entries.html
+++ b/trac/versioncontrol/templates/dir_entries.html
@@ -7,11 +7,11 @@
                    chgset_context = change and context.child('changeset', change.rev, parent=repos.resource);
                    chgset_view = change and change.is_viewable(perm);
                    isdir = entry.kind == 'dir'">
-    <tr class="${idx % 2 and 'even' or 'odd'}">
+    <tr class="${'odd' if idx % 2 else 'even'}">
       <td class="name">
         <a class="$entry.kind" title="${_('View Directory') if isdir else _('View File')}"
            href="${href.browser(reponame, entry.path, rev=stickyrev, 
-                                order=(order != 'name' and order or None), desc=desc)}">$entry.name</a>
+                                order=order if order != 'name' else None, desc=desc)}">$entry.name</a>
       </td>
       <td class="size">
         <span title="${_('%(size)s bytes', size=entry.content_length)}">${pretty_size(entry.content_length)}</span>
@@ -24,9 +24,9 @@
       </td>
       <td class="age" style="${chgset_view and dir.timerange and 'border-color: rgb(%s,%s,%s)' %
                                dir.colorize_age(dir.timerange.relative(change.date)) or None}">
-        ${chgset_view and dateinfo(change.date) or '&ndash;'}
+        ${dateinfo(change.date) if chgset_view else '&ndash;'}
       </td>
-      <td class="author">${chgset_view and authorinfo_short(change.author) or '&ndash;'}</td>
+      <td class="author">${authorinfo_short(change.author) if chgset_view else '&ndash;'}</td>
       <td class="change" py:choose="">
         <py:when test="chgset_view" py:choose="">
           <py:when test="wiki_format_messages">${wiki_to_oneliner(chgset_context, change.message, shorten=True)}</py:when>
diff --git a/trac/versioncontrol/templates/repository_index.html b/trac/versioncontrol/templates/repository_index.html
--- a/trac/versioncontrol/templates/repository_index.html
+++ b/trac/versioncontrol/templates/repository_index.html
@@ -8,13 +8,13 @@
       <py:for each="idx, (reponame, repoinfo, repos, change, err, raw_href) in enumerate(repo.repositories)"
               py:with="chgset_context = change and context.child('changeset', change.rev, parent=repos.resource);
                        chgset_view = change and change.is_viewable(perm)">
-        <tr class="${idx % 2 and 'even' or 'odd'}">
+        <tr class="${'odd' if idx % 2 else 'even'}">
           <td class="name">
             <em py:strip="not err">
               <b py:strip="repoinfo.alias != ''">
                 <a class="dir" title="View Root Directory"
                    href="${href.browser(repos.reponame if repos else reponame,
-                                        order=(order != 'name' and order or None), desc=desc)}">$reponame</a>
+                                        order=order if order != 'name' else None, desc=desc)}">$reponame</a>
               </b>
             </em>
           </td>
@@ -29,9 +29,9 @@
           </td>
           <td class="age" style="${chgset_view and change and repo.timerange and 'border-color: rgb(%s,%s,%s)' %
                                    repo.colorize_age(repo.timerange.relative(change.date)) or None}">
-            ${chgset_view and dateinfo(change.date) or '&ndash;'}
+            ${dateinfo(change.date) if chgset_view else '&ndash;'}
           </td>
-          <td class="author">${chgset_view and authorinfo_short(change.author) or '&ndash;'}</td>
+          <td class="author">${authorinfo_short(change.author) if chgset_view else '&ndash;'}</td>
           <td class="change" py:choose="">
             <py:when test="err"><em py:content="err"></em></py:when>
             <py:when test="chgset_view" py:choose="">
@@ -41,7 +41,7 @@
             <py:otherwise>&ndash;</py:otherwise>
           </td>
         </tr>
-        <tr class="${idx % 2 and 'even' or 'odd'}" py:if="repoinfo.description">
+        <tr class="${'odd' if idx % 2 else 'even'}" py:if="repoinfo.description">
           <td class="description" colspan="6">${wiki_to_html(context.child('source', '/', parent=repos.resource), repoinfo.description)}</td>
         </tr>
       </py:for>
diff --git a/trac/versioncontrol/templates/revisionlog.html b/trac/versioncontrol/templates/revisionlog.html
--- a/trac/versioncontrol/templates/revisionlog.html
+++ b/trac/versioncontrol/templates/revisionlog.html
@@ -77,7 +77,7 @@
             </label>
           </i18n:msg><br />
           <label>
-            <input type="checkbox" id="verbose" name="verbose" checked="${verbose and 'checked' or None}" />
+            <input type="checkbox" id="verbose" name="verbose" checked="${verbose or None}" />
             Show full log messages
           </label>
         </div>
@@ -106,7 +106,7 @@
           <input type="submit" value="${_('View changes')}"
             title="Diff from Old Revision to New Revision (as selected in the Diff column)" />
         </div>
-        <table class="listing chglist${graph and ' trac-graph' or None}">
+        <table class="listing chglist${' trac-graph' if graph else None}">
           <thead>
             <tr>
               <th py:if="graph" class="trac-graph">Graph</th>
@@ -132,7 +132,7 @@
               <py:with vars="change = changes[item.rev];
                              is_separator = item.change is None;
                              chgset_context = context.child('changeset', change.rev, parent=repos.resource);
-                             odd_even = idx % 2 and 'odd' or 'even'">
+                             odd_even = 'odd' if idx % 2 else 'even'">
                 <!--! highlight copy or rename operations -->
                 <tr py:if="not is_separator and item.get('copyfrom_path')" class="$odd_even">
                   <td />
diff --git a/trac/versioncontrol/templates/revisionlog.txt b/trac/versioncontrol/templates/revisionlog.txt
--- a/trac/versioncontrol/templates/revisionlog.txt
+++ b/trac/versioncontrol/templates/revisionlog.txt
@@ -1,5 +1,6 @@
 #
-# ${_('ChangeLog for %(path)s%(in_repo)s', path=path, in_repo=reponame and _(" in %(repo)s", repo=reponame) or '')}
+# ${_("ChangeLog for %(path)s in %(repo)s", path=path, repo=reponame) if reponame \
+    else _("ChangeLog for %(path)s", path=path)}
 # 
 # ${_('Generated by Trac %(version)s', version=trac.version)}
 # ${format_datetime()}
@@ -14,7 +15,7 @@
 {%       end %}\
 {%     end %}\
 
-${verbose and extra.message or shorten_line(extra.message)}
+${extra.message if verbose else shorten_line(extra.message)}
 
 
 {%   end %}\
diff --git a/trac/versioncontrol/templates/sortable_th.html b/trac/versioncontrol/templates/sortable_th.html
--- a/trac/versioncontrol/templates/sortable_th.html
+++ b/trac/versioncontrol/templates/sortable_th.html
@@ -14,11 +14,10 @@
 <html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:py="http://genshi.edgewall.org/"
     xmlns:xi="http://www.w3.org/2001/XInclude" py:strip="">
-  <th class="$class_${order == class_ and (desc and ' desc' or ' asc') or ''}">
+  <th class="$class_${(' desc' if desc else ' asc') if order == class_ else None}">
     <a title="${_('Sort by %(col)s %(direction)s', col=class_, 
-                  direction=(order == class_ and not desc 
-                             and _('(descending)') or _('(ascending)')))}"
-      href="${href.browser(reponame, path, rev=stickyrev, order=(class_ != 'name' and class_ or None),
-      desc=(class_ == order and not desc and 1 or None))}">$title</a>
+                  direction=_('(descending)') if order == class_ and not desc else _('(ascending)'))}"
+      href="${href.browser(reponame, path, rev=stickyrev, order=class_ if class_ != 'name' else None,
+                           desc=1 if class_ == order and not desc else None)}">$title</a>
   </th>
 </html>
diff --git a/trac/versioncontrol/web_ui/browser.py b/trac/versioncontrol/web_ui/browser.py
--- a/trac/versioncontrol/web_ui/browser.py
+++ b/trac/versioncontrol/web_ui/browser.py
@@ -130,8 +130,8 @@ class WikiPropertyRenderer(Component):
         (''since 0.11'')""")
 
     def match_property(self, name, mode):
-        return (name in self.wiki_properties or \
-                name in self.oneliner_properties) and 4 or 0
+        return 4 if name in self.wiki_properties \
+                    or name in self.oneliner_properties else 0
 
     def render_property(self, name, mode, context, props):
         if name in self.wiki_properties:
@@ -258,7 +258,7 @@ class BrowserModule(Component):
             # Get three ints out of a `rgb` string or return `default`
             try:
                 t = tuple([int(v) for v in re.split(r'(\d+)', rgb)[1::2]])
-                return len(t) == 3 and t or default
+                return t if len(t) == 3 else default
             except ValueError:
                 return default
         
@@ -355,8 +355,8 @@ class BrowserModule(Component):
         if reponame and reponame != repos.reponame: # Redirect alias
             qs = req.query_string
             req.redirect(req.href.browser(repos.reponame or None, path)
-                         + (qs and '?' + qs or ''))
-        reponame = repos and repos.reponame or None
+                         + ('?' + qs if qs else ''))
+        reponame = repos.reponame if repos else None
         
         # Find node for the requested path/rev
         context = web_context(req)
@@ -410,7 +410,7 @@ class BrowserModule(Component):
             'created_rev': node and node.created_rev,
             'properties': properties_data,
             'path_links': path_links,
-            'order': order, 'desc': desc and 1 or None,
+            'order': order, 'desc': 1 if desc else None,
             'repo': repo_data, 'dir': dir_data, 'file': file_data,
             'quickjump_entries': quickjump_data,
             'wiki_format_messages': \
@@ -525,11 +525,11 @@ class BrowserModule(Component):
         # Ordering of repositories
         if order == 'date':
             def repo_order((reponame, repoinfo, repos, youngest, err, href)):
-                return (youngest and youngest.date or to_datetime(0),
+                return (youngest.date if youngest else to_datetime(0),
                         embedded_numbers(reponame.lower()))
         elif order == 'author':
             def repo_order((reponame, repoinfo, repos, youngest, err, href)):
-                return (youngest and youngest.author.lower() or '',
+                return (youngest.author.lower() if youngest else '',
                         embedded_numbers(reponame.lower()))
         else:
             def repo_order((reponame, repoinfo, repos, youngest, err, href)):
@@ -592,10 +592,10 @@ class BrowserModule(Component):
             def file_order(a):
                 return embedded_numbers(a.name.lower())
 
-        dir_order = desc and 1 or -1
+        dir_order = 1 if desc else -1
 
         def browse_order(a):
-            return a.isdir and dir_order or 0, file_order(a)
+            return dir_order if a.isdir else 0, file_order(a)
         entries = sorted(entries, key=browse_order, reverse=desc)
 
         # ''Zip Archive'' alternate link
@@ -630,7 +630,7 @@ class BrowserModule(Component):
         if format in ('raw', 'txt'):
             req.send_response(200)
             req.send_header('Content-Type',
-                            format == 'txt' and 'text/plain' or mime_type)
+                            'text/plain' if format == 'txt' else mime_type)
             req.send_header('Content-Length', node.content_length)
             req.send_header('Last-Modified', http_date(node.last_modified))
             if rev is None:
@@ -877,7 +877,7 @@ class BrowserModule(Component):
             add_stylesheet(formatter.req, 'common/css/browser.css')
             wiki_format_messages = self.config['changeset'] \
                                        .getbool('wiki_format_messages')
-            data = {'repo': repo, 'order': order, 'desc': desc and 1 or None,
+            data = {'repo': repo, 'order': order, 'desc': 1 if desc else None,
                     'reponame': None, 'path': '/', 'stickyrev': None,
                     'wiki_format_messages': wiki_format_messages}
             from trac.web.chrome import Chrome
diff --git a/trac/versioncontrol/web_ui/changeset.py b/trac/versioncontrol/web_ui/changeset.py
--- a/trac/versioncontrol/web_ui/changeset.py
+++ b/trac/versioncontrol/web_ui/changeset.py
@@ -488,7 +488,7 @@ class ChangesetModule(Component):
         def node_info(node, annotated):
             href = req.href.browser(
                 reponame, node.created_path, rev=node.created_rev,
-                annotate=annotated and 'blame' or None)
+                annotate='blame' if annotated else None)
             title = _('Show revision %(rev)s of this file in browser',
                       rev=display_rev(node.rev))
             return {'path': node.path, 'rev': node.rev,
@@ -628,8 +628,8 @@ class ChangesetModule(Component):
                         'new': new_node and node_info(new_node, annotated),
                         'props': props,
                         'diffs': diffs}
-                files.append(new_node and new_node.path or \
-                             old_node and old_node.path or '')
+                files.append(new_node.path if new_node else \
+                             old_node.path if old_node else '')
                 filestats[change] += 1
                 if change in Changeset.DIFF_CHANGES:
                     if chgset:
@@ -1005,9 +1005,9 @@ class ChangesetModule(Component):
         if reponame or len(repos_for_uid) > 1:
             title = ngettext('Changeset in %(repo)s ',
                              'Changesets in %(repo)s ',
-                             single and 1 or 2, repo=', '.join(repos_for_uid))
+                             1 if single else 2, repo=', '.join(repos_for_uid))
         else:
-            title = ngettext('Changeset ', 'Changesets ', single and 1 or 2)
+            title = ngettext('Changeset ', 'Changesets ', 1 if single else 2)
         drev_a = older_cset.repos.display_rev(rev_a)
         if single:
             title = tag(title, tag.em('[%s]' % drev_a))
@@ -1045,7 +1045,7 @@ class ChangesetModule(Component):
             r"(?:\b|!)r\d+\b(?!:\d)(?:/[a-zA-Z0-9_/+-]+)?",
             lambda x, y, z:
             self._format_changeset_link(x, 'changeset',
-                                        y[0] == 'r' and y[1:] or y[1:-1],
+                                        y[1:] if y[0] == 'r' else y[1:-1],
                                         y, z))
 
     def get_link_resolvers(self):
@@ -1194,7 +1194,7 @@ class AnyDiffModule(Component):
                                if repos.is_viewable(req.perm))
 
             elem = tag.ul(
-                [tag.li(isdir and tag.b(path) or path)
+                [tag.li(tag.b(path) if isdir else path)
                  for (isdir, name, path) in sorted(entries, key=kind_order)
                  if name.lower().startswith(prefix)])
 
diff --git a/trac/versioncontrol/web_ui/log.py b/trac/versioncontrol/web_ui/log.py
--- a/trac/versioncontrol/web_ui/log.py
+++ b/trac/versioncontrol/web_ui/log.py
@@ -96,7 +96,7 @@ class LogModule(Component):
         if reponame != repos.reponame:  # Redirect alias
             qs = req.query_string
             req.redirect(req.href.log(repos.reponame or None, path)
-                         + (qs and '?' + qs or ''))
+                         + ('?' + qs if qs else ''))
 
         normpath = repos.normalize_path(path)
         # if `revs` parameter is given, then we're restricted to the 
@@ -263,7 +263,7 @@ class LogModule(Component):
                 files = []
                 actions = []
                 for cpath, kind, chg, bpath, brev in changeset.get_changes():
-                    files.append(chg == Changeset.DELETE and bpath or cpath)
+                    files.append(bpath if chg == Changeset.DELETE else cpath)
                     actions.append(chg)
                 cs['files'] = files
                 cs['actions'] = actions
diff --git a/trac/versioncontrol/web_ui/util.py b/trac/versioncontrol/web_ui/util.py
--- a/trac/versioncontrol/web_ui/util.py
+++ b/trac/versioncontrol/web_ui/util.py
@@ -48,7 +48,7 @@ def get_changes(repos, revs, log=None):
 def get_path_links(href, reponame, path, rev, order=None, desc=None):
     desc = desc or None
     links = [{'name': 'source:',
-              'href': href.browser(rev=reponame == '' and rev or None,
+              'href': href.browser(rev=rev if reponame == '' else None,
                                    order=order, desc=desc)}]
     if reponame:
         links.append({
diff --git a/trac/web/chrome.py b/trac/web/chrome.py
--- a/trac/web/chrome.py
+++ b/trac/web/chrome.py
@@ -14,8 +14,6 @@
 #
 # Author: Christopher Lenz <cmlenz@gmx.de>
 
-from __future__ import with_statement
-
 """Content presentation for the web layer.
 
 The Chrome module deals with delivering and shaping content to the end user,
@@ -23,6 +21,8 @@ mostly targeting (X)HTML generation but 
 web content are also using facilities provided here.
 """
 
+from __future__ import with_statement
+
 import datetime
 from functools import partial
 import itertools
@@ -226,7 +226,7 @@ def prevnext_nav(req, prev_label, next_l
                           class_='prev')
         
     add_ctxtnav(req, tag.span(Markup('&larr; '), prev_link or prev_label,
-                              class_=not prev_link and 'missing' or None))
+                              class_='missing' if not prev_link else None))
 
     if up_label and 'up' in links:
         up = links['up'][0]
@@ -238,7 +238,7 @@ def prevnext_nav(req, prev_label, next_l
                           class_='next')
 
     add_ctxtnav(req, tag.span(next_link or next_label, Markup(' &rarr;'),
-                              class_=not next_link and 'missing' or None))
+                              class_='missing' if not next_link else None))
 
 
 def web_context(req, resource=None, id=False, version=False, parent=False,
@@ -267,7 +267,7 @@ def web_context(req, resource=None, id=F
     :rtype: `RenderingContext`
     """
     if req:
-        href = absurls and req.abs_href or req.href
+        href = req.abs_href if absurls else req.href
         perm = req.perm
     else:
         href = None
@@ -728,8 +728,8 @@ class Chrome(Component):
                 # Like 'trac_banner.png'
                 logo_src_abs = abs_href.chrome('common', logo_src)
                 logo_src = href.chrome('common', logo_src)
-            width = self.logo_width > -1 and self.logo_width or None
-            height = self.logo_height > -1 and self.logo_height or None
+            width = self.logo_width if self.logo_width > -1 else None
+            height = self.logo_height if self.logo_height > -1 else None
             logo = {
                 'link': self.logo_link, 'src': logo_src,
                 'src_abs': logo_src_abs, 'alt': self.logo_alt,
@@ -747,7 +747,7 @@ class Chrome(Component):
         }
         
         href = req and req.href
-        abs_href = req and req.abs_href or self.env.abs_href
+        abs_href = req.abs_href if req else self.env.abs_href
         admin_href = None
         if self.env.project_admin_trac_url == '.':
             admin_href = href
@@ -794,7 +794,7 @@ class Chrome(Component):
             return get_resource_url(self.env, resource, abs_href, **kwargs)
 
         d.update({
-            'context': req and web_context(req) or None,
+            'context': web_context(req) if req else None,
             'Resource': Resource,
             'url_of': get_rel_url,
             'abs_url_of': get_abs_url,
@@ -805,7 +805,7 @@ class Chrome(Component):
             'abs_href': abs_href,
             'href': href,
             'perm': req and req.perm,
-            'authname': req and req.authname or '<trac>',
+            'authname': req.authname if req else '<trac>',
             'locale': req and req.locale,
             'show_email_addresses': show_email_addresses,
             'show_ip_addresses': self.show_ip_addresses,
diff --git a/trac/web/href.py b/trac/web/href.py
--- a/trac/web/href.py
+++ b/trac/web/href.py
@@ -170,7 +170,7 @@ class Href(object):
 
         # assemble the query string
         for k, v in kw.items():
-            add_param(k.endswith('_') and k[:-1] or k, v)
+            add_param(k[:-1] if k.endswith('_') else k, v)
         if params:
             href += '?' + unicode_urlencode(params, self.query_safe)
 
diff --git a/trac/web/main.py b/trac/web/main.py
--- a/trac/web/main.py
+++ b/trac/web/main.py
@@ -425,7 +425,7 @@ def dispatch_request(environ, start_resp
         env_error = e
 
     req = Request(environ, start_response)
-    translation.make_activable(lambda: req.locale, env and env.path or None)
+    translation.make_activable(lambda: req.locale, env.path if env else None)
     try:
         return _dispatch_request(req, env, env_error)
     finally:
diff --git a/trac/web/standalone.py b/trac/web/standalone.py
--- a/trac/web/standalone.py
+++ b/trac/web/standalone.py
@@ -315,7 +315,7 @@ def main():
                 from trac.web.fcgi_frontend import FlupMiddleware
                 flup_app = FlupMiddleware(flup_app)
             ret = server_cls(flup_app, bindAddress=server_address).run()
-            sys.exit(ret and 42 or 0) # if SIGHUP exit with status 42
+            sys.exit(42 if ret else 0) # if SIGHUP exit with status 42
 
     try:
         if options.daemonize:
diff --git a/trac/web/tests/session.py b/trac/web/tests/session.py
--- a/trac/web/tests/session.py
+++ b/trac/web/tests/session.py
@@ -21,7 +21,7 @@ def _prep_session_table(env, spread_visi
         db("DELETE FROM session")
         db("DELETE FROM session_attribute")
     last_visit_base = time.mktime(datetime(2010, 1, 1).timetuple())
-    visit_delta = spread_visits and 86400 or 0
+    visit_delta = 86400 if spread_visits else 0
     auth_list, anon_list = [], []
     with env.db_transaction as db:
         for x in xrange(20):
diff --git a/trac/wiki/formatter.py b/trac/wiki/formatter.py
--- a/trac/wiki/formatter.py
+++ b/trac/wiki/formatter.py
@@ -286,7 +286,7 @@ class WikiProcessor(object):
             raise ProcessorError(_("!#%(name)s must contain at least one table"
                                    " cell (and table cells only)",
                                    name=self.name))
-        return Markup(match.group(self.name == 'table' and 1 or 2))
+        return Markup(match.group(1 if self.name == 'table' else 2))
 
     def _format_row(self, env, context, text):
         if text:
@@ -539,7 +539,7 @@ class Formatter(object):
     # HTML escape of &, < and >
 
     def _htmlescape_formatter(self, match, fullmatch):
-        return match == "&" and "&amp;" or match == "<" and "&lt;" or "&gt;"
+        return "&amp;" if match == "&" else "&lt;" if match == "<" else "&gt;"
 
     # Short form (shref) and long form (lhref) of TracLinks
 
@@ -837,9 +837,9 @@ class Formatter(object):
             self.close_indentation() # FIXME: why not lists in quotes?
             self._list_stack.append((new_type, depth))
             self._set_tab(depth)
-            class_attr = (lclass and ' class="%s"' % lclass) or ''
-            start_attr = (start and ' start="%s"' % start) or ''
-            self.out.write('<'+new_type+class_attr+start_attr+'><li>')
+            class_attr = ' class="%s"' % lclass if lclass else ''
+            start_attr = ' start="%s"' % start if start else ''
+            self.out.write('<' + new_type + class_attr + start_attr + '><li>')
         def close_item():
             self.flush_tags()
             self.out.write('</li>')
@@ -877,7 +877,7 @@ class Formatter(object):
     # Definition Lists
 
     def _definition_formatter(self, match, fullmatch):
-        tmp = self.in_def_list and '</dd>' or '<dl class="wiki">'
+        tmp = '</dd>' if self.in_def_list else '<dl class="wiki">'
         definition = match[:match.find('::')]
         tmp += '<dt>%s</dt><dd>' % format_to_oneliner(self.env, self.context,
                                                       definition)
@@ -901,7 +901,7 @@ class Formatter(object):
                         self.in_list_item = True
                         self._set_list_depth(idepth)
                         return ''
-            elif idepth <= ldepth + (ltype == 'ol' and 3 or 2):
+            elif idepth <= ldepth + (3 if ltype == 'ol' else 2):
                 self.in_list_item = True
                 return ''
         if not self.in_def_list:
@@ -913,7 +913,7 @@ class Formatter(object):
 
     def _get_quote_depth(self):
         """Return the space offset associated to the deepest opened quote."""
-        return self._quote_stack and self._quote_stack[-1] or 0
+        return self._quote_stack[-1] if self._quote_stack else 0
 
     def _set_quote_depth(self, depth, citation=False):
         def open_quote(depth):
@@ -923,7 +923,7 @@ class Formatter(object):
             def open_one_quote(d):
                 self._quote_stack.append(d)
                 self._set_tab(d)
-                class_attr = citation and ' class="citation"' or ''
+                class_attr = ' class="citation"' if citation else ''
                 self.out.write('<blockquote%s>' % class_attr + os.linesep)
             if citation:
                 for d in range(quote_depth+1, depth+1):
@@ -1070,7 +1070,7 @@ class Formatter(object):
         args = WikiParser._processor_param_re.split(line)
         del args[::3]
         keys = [str(k) for k in args[::2]] # used as keyword parameters
-        values = [(v and v[0] in '"\'' and [v[1:-1]] or [v])[0]
+        values = [v[1:-1] if v[:1] + v[-1:] in ('""', "''") else v
                   for v in args[1::2]]
         return dict(zip(keys, values))
 
@@ -1323,7 +1323,7 @@ class OneLinerFormatter(Formatter):
             return ''
         else:
             args = fullmatch.group('macroargs')
-            return '[[%s%s]]' % (name,  args and '(...)' or '')
+            return '[[%s%s]]' % (name, '(...)' if args else '')
 
     def format(self, text, out, shorten=False):
         if not text:
diff --git a/trac/wiki/intertrac.py b/trac/wiki/intertrac.py
--- a/trac/wiki/intertrac.py
+++ b/trac/wiki/intertrac.py
@@ -83,7 +83,7 @@ class InterTracDispatcher(Component):
         parts = link.split(':', 1)
         if len(parts) > 1:
             resolver, target = parts
-            if target and (target[0] not in '\'"' or target[0] != target[-1]):
+            if target[:1] + target[-1:] not in ('""', "''"):
                 link = '%s:"%s"' % (resolver, target)
         from trac.web.chrome import web_context
         link_frag = extract_link(self.env, web_context(req), link)
diff --git a/trac/wiki/interwiki.py b/trac/wiki/interwiki.py
--- a/trac/wiki/interwiki.py
+++ b/trac/wiki/interwiki.py
@@ -68,7 +68,7 @@ class InterWikiMap(Component):
         """Replace "$1" by the first args, "$2" by the second, etc."""
         def setarg(match):
             num = int(match.group()[1:])
-            return 0 < num <= len(args) and args[num-1] or ''
+            return args[num - 1] if 0 < num <= len(args) else ''
         return re.sub(InterWikiMap._argspec_re, setarg, txt)
 
     def _expand_or_append(self, txt, args):
@@ -76,7 +76,7 @@ class InterWikiMap(Component):
         if not args:
             return txt
         expanded = self._expand(txt, args)
-        return expanded == txt and txt + args[0] or expanded
+        return txt + args[0] if expanded == txt else expanded
 
     def url(self, ns, target):
         """Return `(url, title)` for the given InterWiki `ns`.
@@ -84,8 +84,8 @@ class InterWikiMap(Component):
         Expand the colon-separated `target` arguments.
         """
         ns, url, title = self[ns]
-        maxargnum = max([0]+[int(a[1:]) for a in
-                             re.findall(InterWikiMap._argspec_re, url)])
+        maxargnum = max([0] + [int(a[1:]) for a in
+                               re.findall(InterWikiMap._argspec_re, url)])
         target, query, fragment = split_url_into_path_query_fragment(target)
         if maxargnum > 0:
             args = target.split(':', (maxargnum - 1))
@@ -141,7 +141,7 @@ class InterWikiMap(Component):
                     if m:
                         prefix, url, title = m.groups()
                         url = url.strip()
-                        title = title and title.strip() or prefix
+                        title = title.strip() if title else prefix
                         map[prefix.upper()] = (prefix, url, title)
             elif line.startswith('----'):
                 in_map = True
@@ -168,7 +168,7 @@ class InterWikiMap(Component):
             interwikis.append({
                 'prefix': prefix, 'url': url, 'title': title,
                 'rc_url': self._expand_or_append(url, ['RecentChanges']),
-                'description': title == prefix and url or title})
+                'description': url if title == prefix else title})
 
         return tag.table(tag.tr(tag.th(tag.em("Prefix")),
                                 tag.th(tag.em("Site"))),
diff --git a/trac/wiki/macros.py b/trac/wiki/macros.py
--- a/trac/wiki/macros.py
+++ b/trac/wiki/macros.py
@@ -54,7 +54,7 @@ class WikiMacroBase(Component):
     def get_macro_description(self, name):
         """Return the subclass's docstring."""
         doc = inspect.getdoc(self.__class__)
-        return doc and to_unicode(doc) or ''
+        return to_unicode(doc) if doc else ''
 
     def parse_macro(self, parser, name, content):
         raise NotImplementedError
@@ -103,11 +103,11 @@ class TitleIndexMacro(WikiMacroBase):
 
     def expand_macro(self, formatter, name, content):
         args, kw = parse_args(content)
-        prefix = args and args[0].strip() or None
+        prefix = args[0].strip() if args else None
         hideprefix = args and len(args) > 1 and args[1].strip() == 'hideprefix'
         minsize = max(int(kw.get('min', 2)), 2)
         depth = int(kw.get('depth', -1))
-        start = prefix and prefix.count('/') or 0
+        start = prefix.count('/') if prefix else 0
         format = kw.get('format', '')
 
         def parse_list(name):
@@ -175,7 +175,7 @@ class TitleIndexMacro(WikiMacroBase):
             groups = []
 
             for key, grouper in groupby(entries, lambda (elts, name):
-                                                elts and elts[0] or ''):
+                                                    elts[0] if elts else ''):
                 # remove key from path_elements in grouped entries for further
                 # grouping
                 grouped_entries = [(path_elements[1:], page_name)
@@ -567,7 +567,7 @@ class MacroListMacro(WikiMacroBase):
     def expand_macro(self, formatter, name, content):
         from trac.wiki.formatter import system_message
 
-        content = content and content.strip() or ''
+        content = content.strip() if content else ''
         name_filter = content.strip('*')
 
         def get_macro_descr():
diff --git a/trac/wiki/model.py b/trac/wiki/model.py
--- a/trac/wiki/model.py
+++ b/trac/wiki/model.py
@@ -68,7 +68,7 @@ class WikiPage(object):
             self.time = from_utimestamp(time)
             self.text = text
             self.comment = comment
-            self.readonly = readonly and int(readonly) or 0
+            self.readonly = int(readonly) if readonly else 0
             break
         else:
             self.version = 0
diff --git a/trac/wiki/templates/wiki_edit.html b/trac/wiki/templates/wiki_edit.html
--- a/trac/wiki/templates/wiki_edit.html
+++ b/trac/wiki/templates/wiki_edit.html
@@ -63,10 +63,10 @@
 
   <body>
     <div id="content" class="wiki"
-       py:with="preview_or_review = action == 'preview' and (not diff or changes[0].diffs)">
+         py:with="preview_or_review = action == 'preview' and (not diff or changes[0].diffs)">
       <div class="trac-topnav" py:if="sidebyside or preview_or_review" py:choose="">
         <a py:when="sidebyside" href="#changeinfo"
-          title="Go to Save, Preview, Review or Cancel buttons">Actions</a>
+           title="Go to Save, Preview, Review or Cancel buttons">Actions</a>
         <a py:when="diff" href="#info" title="See the diffs">Review</a>
         <a py:otherwise="" href="#info" title="See the preview">Preview</a>
         &darr;
diff --git a/trac/wiki/templates/wiki_edit_form.html b/trac/wiki/templates/wiki_edit_form.html
--- a/trac/wiki/templates/wiki_edit_form.html
+++ b/trac/wiki/templates/wiki_edit_form.html
@@ -26,7 +26,8 @@
         </label>
         <input type="checkbox" name="sidebyside" id="sidebyside" checked="$sidebyside" />
       </div>
-      <p><textarea id="text" class="wikitext${not sidebyside and ' trac-resizable' or ''}" name="text" cols="80" rows="$edit_rows">
+      <p><textarea id="text" class="wikitext${' trac-resizable' if not sidebyside else None}"
+                   name="text" cols="80" rows="$edit_rows">
 $page.text</textarea>
       </p>
       <div id="help" i18n:msg="">
diff --git a/trac/wiki/templates/wiki_view.html b/trac/wiki/templates/wiki_view.html
--- a/trac/wiki/templates/wiki_view.html
+++ b/trac/wiki/templates/wiki_view.html
@@ -88,7 +88,7 @@
                       <div py:if="templates" id="template">
                         <label for="template">Using the template:</label>
                         <select name="template">
-                          <option selected="${not default_template in templates and 'selected' or None}"
+                          <option selected="${not default_template in templates or None}"
                                   value="">(blank page)</option>
                           <option py:for="t in sorted(templates)" value="$t"
                                   selected="${t == default_template or None}">$t</option>
diff --git a/trac/wiki/tests/formatter.py b/trac/wiki/tests/formatter.py
--- a/trac/wiki/tests/formatter.py
+++ b/trac/wiki/tests/formatter.py
@@ -95,7 +95,7 @@ class SampleResolver(Component):
     def _format_link(self, formatter, ns, target, label):
         kind, module = 'text', 'stuff'
         try:
-            kind = int(target) % 2 and 'odd' or 'even'
+            kind = 'odd' if int(target) % 2 else 'even'
             module = 'thing'
         except ValueError:
             pass
diff --git a/trac/wiki/web_ui.py b/trac/wiki/web_ui.py
--- a/trac/wiki/web_ui.py
+++ b/trac/wiki/web_ui.py
@@ -234,7 +234,7 @@ class WikiModule(Component):
                     # TRANSLATOR: wiki page
                     'rev': v or _('currently edited'), 
                     'shortrev': v or last + 1,
-                    'href': v and req.href.wiki(page.name, version=v) or None}
+                    'href': req.href.wiki(page.name, version=v) if v else None}
         changes = [{'diffs': diffs, 'props': [],
                     'new': version_info(new_version, old_version),
                     'old': version_info(old_version)}]
@@ -314,7 +314,7 @@ class WikiModule(Component):
                           new_name, old_version, old_name, new_name)
                 redirection.save(author, comment, req.remote_addr)
         
-        req.redirect(req.href.wiki(redirect and old_name or new_name))
+        req.redirect(req.href.wiki(old_name if redirect else new_name))
 
     def _do_save(self, req, page):
         if page.readonly:
@@ -351,8 +351,9 @@ class WikiModule(Component):
             version = int(req.args.get('version', 0))
         old_version = int(req.args.get('old_version') or 0) or version
 
-        what = ((version and old_version and version - old_version > 1) and
-               'multiple') or version and 'single' or 'page'
+        what = 'multiple' if version and old_version \
+                             and version - old_version > 1 \
+               else 'single' if version else 'page'
 
         num_versions = 0
         new_date = None
@@ -382,7 +383,7 @@ class WikiModule(Component):
             req.perm(page.resource).require('WIKI_RENAME')
            
         data = self._page_data(req, page, 'rename')
-        data['new_name'] = new_name is None and page.name or new_name
+        data['new_name'] = new_name if new_name is not None else page.name
         self._wiki_ctxtnav(req, page)
         return 'wiki_rename.html', data, None
         
@@ -526,8 +527,8 @@ class WikiModule(Component):
             'attachments': AttachmentModule(self.env).attachment_data(context),
         })
         if action in ('diff', 'merge'):
-            old_text = original_text and original_text.splitlines() or []
-            new_text = page.text and page.text.splitlines() or []
+            old_text = original_text.splitlines() if original_text else []
+            new_text = page.text.splitlines() if page.text else []
             diff_data, changes = self._prepare_diff(
                 req, page, old_text, new_text, page.version, '')
             data.update({'diff': diff_data, 'changes': changes,
diff --git a/tracopt/mimeview/enscript.py b/tracopt/mimeview/enscript.py
--- a/tracopt/mimeview/enscript.py
+++ b/tracopt/mimeview/enscript.py
@@ -151,7 +151,7 @@ class EnscriptRenderer(Component):
         i = odata.find('<PRE>')
         beg = i > 0 and i + 6
         i = odata.rfind('</PRE>')
-        end = i > 0 and i or len(odata)
+        end = i if i > 0 else len(odata)
 
         odata = EnscriptDeuglifier().format(odata[beg:end].decode('utf-8'))
         return [Markup(line) for line in odata.splitlines()]
diff --git a/tracopt/perm/authz_policy.py b/tracopt/perm/authz_policy.py
--- a/tracopt/perm/authz_policy.py
+++ b/tracopt/perm/authz_policy.py
@@ -169,7 +169,7 @@ class AuthzPolicy(Component):
 
     def get_authz_file(self):
         f = self.authz_file
-        return os.path.isabs(f) and f or os.path.join(self.env.path, f)
+        return f if os.path.isabs(f) else os.path.join(self.env.path, f)
 
     def parse_authz(self):
         self.log.debug('Parsing authz security policy %s',
diff --git a/tracopt/perm/config_perm_provider.py b/tracopt/perm/config_perm_provider.py
--- a/tracopt/perm/config_perm_provider.py
+++ b/tracopt/perm/config_perm_provider.py
@@ -51,4 +51,4 @@ class ExtraPermissionsProvider(Component
             meta = meta.strip().upper()
             if meta and not meta.startswith('_'):
                 permissions.setdefault(meta, []).extend(perms)
-        return [v and (k, v) or k for k, v in permissions.iteritems()]
+        return [(k, v) if v else k for k, v in permissions.iteritems()]

