Repository: biopython/biopython

Issue:
Bio.Seq.transcribe does not evaluate to naturally explained DNA transcription
### Setup

I am reporting a problem with Biopython version 1.81, Python version 3.10.4, and operating
system as follows:

```python
sys.version =  3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]
platform.python_implementation = CPython
platform.platform = Windows-10-10.0.22621-SP0
```

### Expected behaviour

Since transcription is defined as "the process by which the information in a strand of DNA is copied into a new molecule of messenger RNA by an enzyme called RNA polymerase and a number of accessory proteins called transcription factors" I would expect a DNA sequence like "ATCGATCGATCGAGATCGGATCGAT" to be transcribed as "UAGCUAGCUAGCUCUAGCCUAGCUA". 
This would mean that DNA is treated as "Template DNA" and the RNA output would reflect the real product of RNA polymerase. 

### Actual behaviour

If I run the same DNA sequence in Bio.Seq.transcribe() this will evaluate to "AUCGAUCGAUCGAGAUCGGATCGAU". This, even if it reflects the DNA strand in RNA bases it is not what "DNA transcription" biologically does

### Steps to reproduce

```python
import Bio.Seq

dna_seq = "ATCGATCGATCGAGATCGGATCGAT"
current_transcription_output = Bio.Seq.transcribe(dna_seq)  # evaluates to AUCGAUCGAUCGAGAUCGGAUCGAU
```

In  order to achieve the correct result it would required to write as follows:
```python
def transcribe(dna: str) -> str:
    rna_list = []
    dna_2_rna_base_match_table = {
        "T": "A",
        "A": "U",
        "C": "G",
        "G": "C"
    }
    for base in dna:
        rna_list.append(dna_2_rna_base_match_table.get(base, "."))
    return "".join(rna_list)


dna_seq = "ATCGATCGATCGAGATCGGATCGAT"
correct_transcription_output = transcribe(dna_seq)  # evaluates to UAGCUAGCUAGCUCUAGCCUAGCUA
```



Discussion:
The T/U substitution interpretation is long standing (and not unique to Biopython). See http://biopython.org/DIST/docs/tutorial/Tutorial.html#sec24 and quoting:

> The actual biological transcription process works from the template strand, doing a reverse complement (TCAG → CUGA) to give the mRNA. However, in Biopython and bioinformatics in general, we typically work directly with the coding strand because this means we can get the mRNA sequence just by switching T → U.


We could make that more explicit in the docstrings too, in this case the function here: https://github.com/biopython/biopython/blob/master/Bio/Seq.py#L2815

What you want can be done in combination with the (reverse) complement functionality.
I think that putting the explanation you mention in the docstring would be way more clear. 
Kind regards
You can't do figures easily in docstrings - so the quoted text alone?
Yes, I come from a molecular biology background and if the text you cited where in the docstring I would not have opened this issue in the first place.
Instead I found the current docstring that to me sounds like "yeah, it does transcription figure out the rest". 
So, just to repeat, I think that we can either add or substitute the current docstring with the block of text that you reported.

Resolving patch:
diff --git a/Bio/Seq.py b/Bio/Seq.py
--- a/Bio/Seq.py
+++ b/Bio/Seq.py
@@ -1,7 +1,7 @@
 # Copyright 2000 Andrew Dalke.
 # Copyright 2000-2002 Brad Chapman.
 # Copyright 2004-2005, 2010 by M de Hoon.
-# Copyright 2007-2020 by Peter Cock.
+# Copyright 2007-2023 by Peter Cock.
 # All rights reserved.
 #
 # This file is part of the Biopython distribution and governed by your
@@ -1912,6 +1912,10 @@ def reverse_complement_rna(self, inplace=False):
     def transcribe(self, inplace=False):
         """Transcribe a DNA sequence into RNA and return the RNA sequence as a new Seq object.
 
+        Following the usual convention, the sequence is interpreted as the
+        coding strand of the DNA double helix, not the template strand. This
+        means we can get the RNA sequence just by switching T to U.
+
         >>> from Bio.Seq import Seq
         >>> coding_dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
         >>> coding_dna
@@ -2815,6 +2819,10 @@ def defined_ranges(self):
 def transcribe(dna):
     """Transcribe a DNA sequence into RNA.
 
+    Following the usual convention, the sequence is interpreted as the
+    coding strand of the DNA double helix, not the template strand. This
+    means we can get the RNA sequence just by switching T to U.
+
     If given a string, returns a new string object.
 
     Given a Seq or MutableSeq, returns a new Seq object.


Test patch: